【问题标题】:form for nested resource嵌套资源表单
【发布时间】:2011-06-18 02:31:44
【问题描述】:

我已经处理了大量的 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 in Questions#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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    编辑:

    也试试:

    form_for([@job, @question])
    

    【讨论】:

    • 第一个选项有效,谢谢! - 传递 url 做什么可以解决这个问题?此外,该问题的 job_id 没有在数据库中更新 - 知道如何解决这个问题吗?仅供参考:编辑返回此错误:没有路由匹配 {:controller=>"questions"}
    • 当您没有通过:url 选项时,Rails 会尝试自行解决。它不知道Question 始终是Job 的子资源,因为它并不总是必须如此。关于job_id 未更新,如果您使用批量分配,它可能会忽略它。单独致电question.job = new_job。不过我看不到你的代码。
    • 嘿@d11wtq,我不完全确定你所说的调用 question.job = new_job 是什么意思——那是什么意思?这是我的仓库 [link(github.com/igrabes/InterQ),如果有帮助的话。
    • 您必须针对新问题发布一个新问题,或者更新您现有的问题,因为我不清楚问题是什么。听起来您正在尝试执行question.update_attributes({:job_id =&gt; 1}) 之类的操作,但这是行不通的。但最好更详细地描述问题。
    • 刚刚看了你的代码。你永远不会将job_id 传递给Question,所以它永远不会得到job_id。试试@job.questions.new(params[:question])。那应该确保它具有正确的参考。无论如何,您应该真正加载Job,以确保job_id 确实存在。 @job = Job.find(params[:id]),然后是@question = @job.questions.new(params[:question])
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多