2011-09-13 7 views
0

私は#show#ページにページを持っています。私はそのページの中にメッセージフォームを作成しました。提出されたとき、私はこのエラー "ルーティングエラールートが[POST]/pages/9と一致しません"を取得します。Rails 3:別のモデルのshowメソッド内でフォームを送信する方法

他のモデルのショーページ内のフォームです。この場合、それは、ページ・ショー・ビュー内のMessageモデルで機能するフォームです。指定された

<%= form_for(@message, :url => page_path(@page)) do |f| %> 
<div class="field"> 
    <%= f.label :content %><br /> 
    <%= f.text_area :content %> 
</div> 
<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

答えて

0

URL:

URL => page_path(@page)

は、メッセージを作成するために使用されるルートであるべき。

rake routesを実行すると、アプリが現在持っているすべてのルートを見つけることができます。

+0

検証エラーがある場合、私は、それを指定しない場合、それは私を取りますよmessages#新しいアクション、ページ#showで本当にエラーを表示したいとき。 – leonel

+0

aresenの答えをチェックしてください。その答えは、正しいメッセージ作成URLに投稿した後は、エラーがある場合にページからshowアクションをレンダリングするだけです。 – Msencenb

0

あなたはそれを:url => page_path(@page)としています。これは/pages/9です。 :urlを省略してみてください。これは新しいメッセージであり、あなたを正しい道に連れて行くと推測する必要があります。それ以外の場合は、明示的にしたい場合は、:url => message_pathのようにする必要があります(リソースのルートパスへのPOSTは通常、作成アクションにマップされるため、message_pathの引数はありません)。

+0

これを省略すると、検証エラーが発生したときにメッセージ#new action私が本当にページ#showでエラーを表示したいとき。 – leonel

+0

これはコントローラの動作がどのように書かれているかの結果です。それをページに戻したい場合は、 'redirect:back'か' request.referer'を使って調べることができます。 – dantswain

1

あなたは、ページをリロードせずにエラーを受信して​​表示する、「/メッセージ」パスにリクエストを送信するためにAJAXを使用するか、あなたのルートを少し変更することがあります。

match "pages/:id", :via=>:post, :controller=>"pages", :action=>"create_message" 

はその後通常のcreateアクションと同様にアクションcreate_messageを定義します:

は、追加のルートを定義し、メッセージが作成されている場合、 /pages/:idにリダイレクトし、エラーが発生した場合、レンダリング」ショー "アクション。

エラーの場合は、あなたも「ショー」ビュー(コード422は良いもののように見える)をレンダリングするとき、適切なHTTPステータスコードを返すについて覚えて、単に「ショー」を作るべきでは@message可能性を認識して見ますエラーメッセージ。

私はメッセージPOST /page/3/messagesがよりよい解決策のように見える)を作成するためのこの方法を好きかどうかわからないが、私はまた、これは悪いことであると確信していません。 ;-)

+0

私はAJAXについて考えましたが、ウェブサイトの訪問者がJavascriptを無効にしている場合はどうなりますか?まず、Javascript以外のソリューションに依存する必要があります。 – leonel

+0

あなたは私のヒーローです!;-)私は言った: "使用するAJAX **または**あなたのルートを変更する"。コアとなるのは非AJAXソリューションです。もちろん、問題なくAJAXを追加することができます。 – Arsen7

関連する問題