嵌套资源的表单

时间:2011-06-18 02:31:44

标签: ruby-on-rails form-for nested-resources

我已经完成了大量的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

感谢任何帮助,如果您需要更多信息,请告知我们,谢谢。

2 个答案:

答案 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