2011-06-18 9 views
7

ネストされたリソースの質問のために、私は数多くのform_forを調査しています。私は個人的な質問をする時間を考えました。ネストされたリソース用のフォーム

私は2つのモデル、仕事と質問、仕事has_many質問と質問belongs_to仕事を持っています。

スキャフォールディングを使用してコントローラとモデルを作成し、routes.rb内のリソースをネストしました。

root :to => "pages#home" 

resources :jobs do 
    resources :questions 
end 

get "pages/home" 
get "pages/about" 
get "pages/contact" 


class Job < ActiveRecord::Base 
    has_many :questions 
end 

class Question < ActiveRecord::Base 
    belongs_to :job 
end 

今私がアクセスしようとしています「/仕事/ 1 /質問/新しい」と

が、私はエラー を開始し、新たな#質問で

NoMethodErrorを得続けるNoルート一致しませんコードは

<%= form_for(@question) do |f| %> 

が、私はこれは間違っている知っていたので、私は他のコンボやそれらのどれを試してみました:{コントローラー=>「質問」}働いた。

私は

<%= form_for(@job, @question) do |f| %> 

他の組み合わせの束の中で、それが働いていないことを

<%= form_for([@job, @job.questions.build ]) do |f| %> 

こと

<%= form_for([@job.questions.build ]) do |f| %> 

を試してみました。 gitのクローンhttps://gist.github.com/1032734

すべてのヘルプは高く評価され

、あなたが、おかげでより多くの情報が必要な場合は私に知らせて:ここで

は私のすくいルートへのリンクです。

答えて

12

私はちょうど余分なオプションとしてURLを渡します

<%= form_for(@question, :url => job_questions_path(@job)) do %> 

EDIT:また

してみてください:

form_for([@job, @question]) 
+0

最初にオプションが働いた、ありがとう! - URLを渡すと、これが解決されますか?また、問題のjob_idはDB内で更新されていません - それを修正する方法はありますか? {:controller => "questions"} – Igrabes

+0

':url'オプションを渡さないと、Railsはそれを単独で実行しようとします。 'Question'は必ずしもそうである必要はないので、' Job'のサブリソースであることはわかりません。更新されていない 'job_id'に関して、あなたが大量割り当てを使用しているなら、おそらくそれを無視しているでしょう。 'question.job = new_job'を別途呼び出してください。私はあなたのコードを見ることはできません。 – d11wtq

+0

こんにちは@ d11wtq、私はあなたが何を意味するのかよくわからないquestion.job = new_job - どこに行くのですか?それが私のrepo [リンク(https://github.com/igrabes/InterQ)、もしそれが役立ちます。 – Igrabes

2

これは私が鉱山:)

を解決する方法であります

ご参考までにquestions/_form.html.erb

<%= form_for [@job, @question] do %> 

これを機能させるには、ジョブのIDが必要です。次のようにあなたはそれを渡します:

def new 
    @job = Job.find(params[job_id]) 
    @question = @job.questions.build 
end 

questions_controller.rbでビルド( .buildは)のみレールの古いバージョンの違いで、上記のコードで( .new)を使用して新しいと同様です。レール2を下ろす。アクション(まだ questions_controller.rb中)

def create 
    @job = Job.find(params[:job_id]) 
    @question = @job.questions.build(question_params) 
end 

を作成するには、これらのみを使用した場合のために

さて、問題のモデルでJOB_IDとuser_idのフィールドが空になります。 、IDを追加します。これを行うに:あなたのquestions_controller.rbで はそうのようなjob_paramsにJOB_IDを追加します。

def question_params 
    params.require(:question).permit(:ahaa, :ohoo, :job_id) 
end 

その後(あなたが工夫を使用している場合)、ユーザーのIDを渡すために、ん:

def create 
    @job = Job.find(params[:job_id]) 
    @question = @job.questions.build(question_params) 
    @question.user_id = current_user.id 
end 
関連する問題