7

我已经处理了大量的 form_for 嵌套资源问题,但找不到任何适合我的解决方案。我想是时候问一个个性化的问题了。

我有两个模型,工作和问题,工作有_许多问题和问题属于_工作。

我使用脚手架创建控制器和模型,然后将资源嵌套在 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”并继续获取

问题中的 NoMethodError#new

我从错误No route matches {:controller=>"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| %>

在一堆其他组合中,这些组合不起作用。

这是我的 rake 路线的链接: git clone https://gist.github.com/1032734

任何帮助表示赞赏,如果您需要更多信息,请告诉我,谢谢。

4

2 回答 2

12

我只是将 URL 作为额外选项传递:

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

编辑:

也试试:

form_for([@job, @question])
于 2011-06-18T03:38:10.167 回答
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( .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
于 2017-02-27T13:29:54.613 回答