我已经完成了大量的form_for嵌套资源问题,无法让任何解决方案适合我。我想时间问一个个性化的问题。
我有两个模型,工作和问题,工作有很多问题和问题属于工作。
我使用scaffolding创建控制器和模型,然后嵌套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
现在我正在尝试访问'/ jobs / 1 / questions / new'并继续获取
问题#new
中的NoMethodError当代码
时,我开始使用错误无路由匹配{:controller =&gt;“questions”}<%= form_for(@question) do |f| %>
我知道这是错的,所以我开始尝试其他组合,但没有一个工作。
我试过
<%= form_for([@job.questions.build ]) do |f| %>
这
<%= form_for([@job, @job.questions.build ]) do |f| %>
这
<%= form_for(@job, @question) do |f| %>
在众多其他组合中并且无效。
以下是我的佣金路线的链接:git clone https://gist.github.com/1032734
感谢任何帮助,如果您需要更多信息,请告知我们,谢谢。
答案 0 :(得分:12)
我只是将URL作为额外选项传递:
<%= form_for(@question, :url => job_questions_path(@job)) do %>
编辑:
还可以尝试:
form_for([@job, @question])
答案 1 :(得分:2)
这就是我解决的问题:)。
在questions/_form.html.erb
<%= form_for [@job, @question] do %>
为此,您需要工作的ID。您将按如下方式传递:
在questions_controller.rb
def new
@job = Job.find(params[job_id])
@question = @job.questions.build
end
构建(.build
)类似于在上面的代码中使用new(.new
),仅在较旧版本的rails中有差异;铁轨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_id到job_params,如:
def question_params
params.require(:question).permit(:ahaa, :ohoo, :job_id)
end
然后传递用户的ID(如果您使用的是Devise),请执行:
def create
@job = Job.find(params[:job_id])
@question = @job.questions.build(question_params)
@question.user_id = current_user.id
end