プロが教える店舗&オフィスのセキュリティ対策術

現在rails3.2でrailsの勉強をしています。この過程で困ったことがありましたので質問させていただきました。
それはviewにfomr_forを定義するとエラーをはいて動かないのです。
具体的にソースで説明します。
・コントロールのソース
class ComicListController < ApplicationController
def index
@comic_master_r = ComicMaster.new
end
end

・Viewのソース
<%= form_for @comic_master_r do |f| %>
<% end %>

・エラーの内容
undefined method `comic_masters_path' for #<#<Class:0x9da00d0>:0x9e73d04>

私個人の見解としては、form_forを使う際に必要とされるコントロール側の変数の定義が足りないからではないかと思っているのですが、googleの検索結果ではViewしか書いていないことが多く、コントロールにどんなものを定義すればいいのか、うまく判断がつきません。
ご回答お待ちしております。

A 回答 (2件)

undefined method `comic_masters_path'


とありますので、ルーティングのためのURLの生成に失敗しているようですね

推測ですがconfig/routes.rbにコントローラーの情報の登録を忘れていないでしょうか?

routes.rbを開いて以下の行を追加してみてください

resources(:comic_masters)

その後に,unix環境なら
rake routes | grep comic
と入力して
comic_masters GET /comic_masters(.:format) comic_masters#index
の様な感じの行が表示されれば設定がうまく行った証拠です
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。おかげさまで上記のルーティングを追加すれば動くようになりました。

ただ疑問が少し残ります。もしよろしければ本題からは少しずれますが、お答えいただけると幸いです。

<<undefined method `comic_masters_path'
<<とありますので、ルーティングのためのURLの生成に失敗しているようですね
なぜこのエラーでルーティングに失敗していると分かったのですか?自分は色々ぐぐってもこの答えにたどり着けませんでした。

<<comic_masters GET /comic_masters(.:format) comic_masters#index
<<の様な感じの行が表示されれば設定がうまく行った証拠です
submitを押した後に遷移先のURLとコントローラを結びつける過程でエラーになるのならわかるのですが、なぜform_forをViewに定義するだけでルーティングが必要となるのですか?

以上です。よろしければもう少しだけお付き合いください。

お礼日時:2012/04/12 13:55

何故分かったのかは簡単で、私も以前似た問題に出会ったからです



実際には、form_forの使い方で調べていくとわかりやすいと思います

例をとってみると、以下の2つの書式は、ほぼ同じ意味です

例1
<%=form_for :comic_masters, url: comic_masters_path, :method => "POST" do |f| %>
<% end %>

例2
<%=form_for :comic_masters, url: url_for( :controller => :comic_masters, :action => :create ) do |f| %>
<% end %>

フォームの値の取り方や、ボタンを押した時に何処のアクションにジャンプするかは
はrailsの規約にのっかれば決まりきっているので、裏側で自動変換してくれているのですね

なんでcomic_masters_pathでPOSTすると、createアクションに行くのか
comic_masters_pathって何なのかは
「rails restful」で検索するとわかると思います
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

railsはで裏側で色々やってくれているのですね。やはりこのあたりはちゃんと理解していこうとおもいます。
またRESTに関しては概念レベルで知らなかったのでとても勉強になりました。ありがとうございました。

お礼日時:2012/04/14 02:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!