【发布时间】: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