2011-07-24 11 views
2

新しいレールのように私に同行してください。私がしたいことは、画面上にメッセージのリストがあるかどうかです。メッセージを「閉じた」とマークすると、完全な日付を記入するだけです。Railsでは、コントローラ内の特定のメソッドをビューのフォームから呼び出す方法はありますか?

<%= form_for (???) do |f| %> 
    Are you sure you wish to close this message?<br> 
    <%= hidden_field_tag 'messageId', message.id.to_s %> 
    <%= submit_tag "Close Message" %> 
<% end %> 

私はどのように考え出すの問題を抱えている:

class MessagesController < ApplicationController 
def close 
    @message = Message.find(params[:messageId]) 
    @message.completeDate = Date.today 
    if @message.save 
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." } 
    else 
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." } 
    end 
end 
end 

私はビューを持っている:私は、コントローラを持って

class Message < ActiveRecord::Base 
    attr_accessible :topic, :body, :completeDate, :created_at 
    belongs_to :account 
    belongs_to :user 
    has_many :message_followups 
end 

私はモデルを持っていますform_forまたはform_tagを取得して、メッセージ・コントローラー内の特定のメソッド 'close'を呼び出します。どんな助けでも大変感謝します。

マット

+0

私はここから始めるでしょう-http://guides.rubyonrails.org/form_helpers.html – house9

答えて

6

非常に重要なヒントであるはRubyの変数名にラクダ文字を使うべきではなく、変数サンドメソッドは別の言語から来ている場合は区切り記号としてアンダースコアを使用する必要がありますJavaでは、そこで使用したのと同じ命名パターンを使用しないようにしてください。ルビーのキャメルケースはクラス名とモジュール名のみです。

Ruby on Rails 3を使用していると思いますが、使用していることは分かりません。まず、あなたはそのためのルートを必要とする、それはあなたのroutes.rbをファイルに次のようになります。

resources :messages do 
    member do 
     post 'close' 
    end 
end 

あなたのコントローラにほとんど変化

def close 
    @message = Message.find(params[:id]) #you don't need to use the hidden field here 
    @message.completeDate = Date.today 
    if @message.save 
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." } 
    else 
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." } 
    end 
end 

そして、あなたのフォームは次のように見えるように起こっています:

<%= form_for(@message, :url => close_message_path(@message), :html => { :method => :post }) do |f| %> 
    Are you sure you wish to close this message?<br> 
    <%= f.submit "Close Message" %> 
<% end %> 

このフォームは、「クローズ/メッセージ/ ID_HERE /」に掲載される予定であるとRailsはあなたの要求の「ID」をパラメータとして「ID_HERE」の値を設定しようとしています。

You can see the full documentation about form_for here

+0

ありがとうMauricio、あなたは正しいです、私はRails 3を使用しています。私がJavaの背景から来ています。ヒントをお寄せいただきありがとうございます。将来私の命名規則をより意識していきます。詳細な応答をいただきありがとうございます。これはもっと意味があります。 –

+0

RubyをJavaから動かすと、変わった名前でこのファンキーな考えができましたが、今日はどちらの場合でも美しさを見ることができます:) –

2

このような何かはあなたのために離れて物事を二乗する必要があります

<%= form_for @message, :url => { :action => "close" }, :html => { :method => :put } do |f| %> 

これは何あなたがメッセージコントローラでclose方法にHTTP PUTメソッドを実行していることを指定します。 form_forヘルパーメソッドの詳細については、あなただけのこの操作を行うことができない場合here

0

あなたは、あなたのコントローラでupdateメソッドを持っていますか読み:

コントローラ内で次に
<%= form_for(@message) do |f| 
    <p>Are you sure you wish to close this message?</p> 
    <%= hidden_field_tag :close %> 
    <%= f.submit "Close Message" %> 
<% end %> 

class MessagesController < ApplicationController 

    def update 
    @message = Message.find(params[:id]) 
    @message.completeDate = Date.today if params.has_key?(:close) 
    if @message.save 
     redirect_to myHomeMessages_path, 
     :flash => { :success => "Your message was closed." } 
    else 
     redirect_to myHomeMessages_path, 
     :flash => { :error => "Error closing message." } 
    end 
    end 
end 
関連する問題