在Ruby on Rails表单中更新子协会

时间:2017-07-18 01:52:04

标签: html ruby-on-rails forms associations parent-child

我有父母"帐户"有很多"优先事项。"

我可以非常轻松地为这些帐户创建新的优先级,但我无法在创建后对其进行编辑/更新。

帐户模型(父母):

class Account < ApplicationRecord
  has_many :priorities
  accepts_nested_attributes_for :priorities
end

优先级模型(孩子):

class Priority < ApplicationRecord
  belongs_to :account
end

路线:

  resources :accounts do
    resources :priorities
  end

priorities_controller.rb(只是编辑,更新和参数)

class PrioritiesController < ApplicationController

  def edit
    @account = Account.find(params[:account_id])
    @priority = @account.priorities.find(params[:id])
  end

  def update
    @account = Account.find(params[:account_id])
    @priority = @account.priorities.update(priority_params)

  end

  private
    def priority_params
      params.require(:priority).permit(:name, :narrative, :kpis)
    end

end

最后,我的edit.html.erb(所以这最终成为帐户/#/ priorities /#/ edit)

<%= form_for(@account) do |a| %>

<%= a.fields_for :priorities, @priority do |p| %>
  <p>
    <%= p.label :name %><br>
    <%= p.text_field :name %>
  </p>

  <p>
    <%= p.label :narrative %><br>
    <%= p.text_area :narrative %>
  </p>

  <p>
    <%= p.label :kpis, "KPIs" %><br>
    <%= p.text_field :kpis %>
  </p>

  <p>
    <%= p.submit %>
  </p>
<% end %>
<% end %>

到目前为止,一切都很顺利。表单完美地获取正确优先级的表单数据,如果您尝试输入与该帐户ID无关的优先级ID,它甚至会失败。但是,当我点击&#34;更新优先级&#34;我明白了:

&#34;行动&#39;更新&#39;找不到AccountsController&#34;

现在,我可以跟踪错误并为此控制器创建更新,但我认为它甚至不应该尝试触发AccountsController,似乎应该尝试使用优先级控制器。

确实如果我检查控制台,请求似乎在这里: 请求网址:angular-schema-form-dynamic-select

对不起,我已经搜索了至少10个小时来回答这个问题并且无法找到它。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

正如this回答和this回答中所述,我认为您需要执行以下操作:

<%= form_for [@account, @priority] do |f| %>
  blah blah
<% end %>

(公平归因:直接取自第二个相关答案。)

正如你所指出的那样:

    <%= form_for(@account) do |a| %>

将为update上的AccountsController操作生成一个网址。因为,这正是rails的工作方式。如果需要嵌套资源的URL,则需要在form_for声明中包含两个实例变量。