【问题标题】:Accepts_nested_attributes_for join table of a has_many through relationshipAccepts_nested_attributes_for 通过关系连接一个 has_many 表
【发布时间】:2013-12-04 14:26:22
【问题描述】:

我有一个 has_many through 关系,并试图在创建过程中将属性保存到连接表。我已经阅读了我可以在网上找到的所有内容,但似乎无法真正保存任何内容。使用 simple_form 的 Rails 4 应用程序。

模型设置

class Request < ActiveRecord::Base
  has_many :line_items, through: :requestables
  has_many :requestables
end

class LineItem < ActiveRecord::Base
  has_many :requests, through: :requestables, dependent: :destroy 
  has_many :requestables

  accepts_nested_attributes_for :requestables
end

 class Requestable < ActiveRecord::Base
   belongs_to :line_item
   belongs_to :request
   validates :line_item_id, presence: true
   validates :request_id, presence: true
 end

表格的相关部分

<%= simple_form_for ([@request, @line_item]), remote: true do |f| %>
<%= f.error_notification %>
    <div class="form-inputs">
    <%= f.input :name, :required => true, :autofocus => true  %>
    <%= f.simple_fields_for :requestables do |r| %>
      <%= r.input :quantity, :required => true %>
      <% end %>
 *rest of form*

控制器(我正在索引页面上创建 LineItems)。我添加了@line_item.requestables.build,所以我可以将它包含在表单中。

class LineItemsController < ApplicationController

def index
  @request = Request.find(params[:request_id])
  @line_item = @request.line_items.build
  @line_item.requestables.build
end

def create
  @request = Request.find(params[:request_id])
  @line_item = @request.line_items.create(line_item_params)
  if @line_item.save
    respond_to do |format|
     format.html { redirect_to :action => :index }
     format.js { flash.now[:success] = "Boom" }
    end
  else
    redirect :action => index
  end

private
  def line_item_params
    params.require(:line_item).permit(:name, :requestables_attributes => [:quantity])
  end 
end

我想创建一个新的 LineItem,同时将数量保存到连接表/requestables。我似乎一切都正确 - 当我没有在表单中包含数量时,它会正确保存 LineItem 并自动创建连接表。但是当我使用 about 代码时,我得到以下信息:

Processing by LineItemsController#create as JS
Parameters: {"utf8"=>"√", "line_item"=>{"name"=>"Pillow", "requestables_attributes"=>{"0"=>{"quantity"=>"11"}}}, "commit"=>"Add to List", "request_id"=>"5"}
User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
Request Load (1.0ms)  SELECT "requests".* FROM "requests" WHERE "requests"."id" = $1 LIMIT 1  [["id", "5"]]
CACHE (0.0ms)  SELECT "requests".* FROM "requests" WHERE "requests"."id" = $1 LIMIT 1  [["id", "5"]]
(0.0ms)  BEGIN
(0.0ms)  COMMIT
(0.0ms)  BEGIN
(0.0ms)  ROLLBACK
Redirected to http://localhost:3000/requests/5/line_items
Completed 302 Found in 19ms (ActiveRecord: 2.0ms)

它无法保存任何内容,只是重定向。

我可以通过在保存后立即使用数量更新可请求项来达到我想要的结果,但这似乎不是 Rails 方式,我无法为编辑表单取回数量。

任何帮助将不胜感激。

【问题讨论】:

  • 我根据几天的研究得出的结论是,不可能同时使用 rails 关联创建连接模型并同时向连接模型添加属性。相反,我现在创建连接模型并立即使用属性对其进行更新。
  • 你能回答你自己的问题吗

标签: ruby-on-rails ruby ruby-on-rails-4 simple-form has-many-through


【解决方案1】:

当您使用 Rails4 时,请确保您有

# attr_accessible
gem 'protected_attributes'

gem 在 Gemfile 中并使用 attr_accessible

# Setup accessible (or protected) attributes for your model----------
attr_accessible :name, :requestables_attributes

Rails 4 现在使用 strong parameters

为了使用带有强参数的accepts_nested_attribute_for,您需要指定应将哪些嵌套属性列入白名单。

【讨论】:

  • 这没有回答问题,您正在避免使用 Rails 4 功能,并且在 OP 问题中他正在定义白名单参数。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多