mar*_*ion 6 ruby-on-rails simple-form strong-parameters ruby-on-rails-5 ruby-on-rails-5.1
所以我的reconciliation
模型看起来像这样:
class Reconciliation < ApplicationRecord
belongs_to :location
belongs_to :company
has_and_belongs_to_many :inventory_items
accepts_nested_attributes_for :inventory_items, allow_destroy: true
end
Run Code Online (Sandbox Code Playgroud)
我的InventoryItem
模型看起来像这样:
class InventoryItem < ApplicationRecord
belongs_to :product
belongs_to :location, inverse_of: :inventory_items
has_and_belongs_to_many :reconciliations
end
Run Code Online (Sandbox Code Playgroud)
在我看来ReconciliationsController
,这就是我的reconciliation_params
样子:
def new
@location = Location.find(params[:location_id])
@reconciliation = @location.reconciliations.new
@inventory_items = @location.inventory_items
@start_index = 0
@next_index = @start_index + 1
end
def reconciliation_params
params.require(:reconciliation).permit(:inventory_item_id, :location_id, :display_id, :inventory_items,
inventory_items_attributes: [:id, :quantity_left, :quantity_delivered, :_destroy]
)
end
Run Code Online (Sandbox Code Playgroud)
这是我的相关部分routes.rb
:
resources :locations, shallow: true do
resources :inventory_items
resources :reconciliations
end
Run Code Online (Sandbox Code Playgroud)
这是我的views/reconciliations/_form.html.erb
:
<%= simple_form_for @reconciliation, url: :location_reconciliations do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :location_id, as: :hidden %>
<%= f.simple_fields_for :inventory_item do |inventory| %>
<%= inventory.input :quantity_left %>
<%= inventory.input :quantity_delivered %>
<% end %>
</div>
<div class="form-actions">
<%= f.button :submit, "Update", class: "btn btn-primary" %>
</div>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是我的app/views/reconciliations/new.html.erb
:
<% if params[:next].nil? %>
<%= render 'form', reconciliation: @reconciliation, inventory_item: @inventory_items[@start_index] %>
<% else %>
<%= render 'form', reconciliation: @reconciliation, inventory_item: @inventory_items[@next_index] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是我尝试创建reconciliation
对象时的日志:
Started POST "/locations/2/reconciliations" for 127.0.0.1 at 2018-03-24 23:16:33 -0500
Processing by ReconciliationsController#create as HTML
Parameters: {"utf8"=>"?", "authenticity_token"=>"JZvhwloo0+XM9bmptxXGfnDw==", "reconciliation"=>{"location_id"=>"2", "inventory_item"=>{"quantity_left"=>"1", "quantity_delivered"=>"170"}}, "commit"=>"Update", "location_id"=>"2"}
Unpermitted parameter: :inventory_item
Location Load (0.9ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
(0.6ms) BEGIN
(0.7ms) ROLLBACK
Rendering reconciliations/new.html.erb within layouts/application
InventoryItem Load (1.0ms) SELECT "inventory_items".* FROM "inventory_items" WHERE "inventory_items"."location_id" = $1 [["location_id", 2]]
Product Load (1.0ms) SELECT "products".* FROM "products" WHERE "products"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
Rendered reconciliations/_form.html.erb (45.9ms)
Rendered reconciliations/new.html.erb within layouts/application (66.8ms)
Rendered shared/_navbar.html.erb (1.3ms)
Completed 200 OK in 202ms (Views: 115.1ms | ActiveRecord: 29.1ms)
Run Code Online (Sandbox Code Playgroud)
我试过简单地添加:inventory_item
到我的params.require(:reconciliation).permit(..)
,但这不起作用.
我错过了什么?
编辑1
当我在我的表单上检查HTML输入时simple_fields_for
,HTML中似乎没问题:
<input class="string required" type="text" name="reconciliation[inventory_item][quantity_left]" id="reconciliation_inventory_item_quantity_left">
Run Code Online (Sandbox Code Playgroud)
编辑2
当我将simple_fields_for
调用更改为复数时,即:inventory_items
,而不是:inventory_item
像这样:
表格的整个部分完全消失了.
这就是HTML的样子:
<div class="form-inputs">
<div class="input hidden reconciliation_location_id"><input class="hidden" type="hidden" value="2" name="reconciliation[location_id]" id="reconciliation_location_id"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
这是HTML在simple_field_for :inventory_item
单数时的外观:
<div class="form-inputs">
<div class="input hidden reconciliation_location_id"><input class="hidden" type="hidden" value="2" name="reconciliation[location_id]" id="reconciliation_location_id"></div>
<div class="input string required reconciliation_inventory_item_quantity_left"><label class="string required" for="reconciliation_inventory_item_quantity_left"><abbr title="required">*</abbr> Quantity left</label><input class="string required" type="text" name="reconciliation[inventory_item][quantity_left]" id="reconciliation_inventory_item_quantity_left"></div>
<div class="input string required reconciliation_inventory_item_quantity_delivered"><label class="string required" for="reconciliation_inventory_item_quantity_delivered"><abbr title="required">*</abbr> Quantity delivered</label><input class="string required" type="text" name="reconciliation[inventory_item][quantity_delivered]" id="reconciliation_inventory_item_quantity_delivered"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
关联形式应为复数f.simple_fields_for :inventory_items
。您应该在新控制器的操作中初始化一个新的 inventory_item 对象
def new
@reconciliation = Reconciliation.new
# you can create as many new items as you want
@reconciliation.inventory_items.build
end
Run Code Online (Sandbox Code Playgroud)
如果您想动态地将项目添加到表单中,我建议您使用https://github.com/nathanvda/cocoon
但看起来您想将现有的 inventory_item 添加到新的对帐中,您最好使用has_many through
关联http://guides.rubyonrails.org/association_basics.html#choosing- Between-has-many-through-and-has-and-belongs -太多
添加具有必要字段和关联的连接模型对象更容易。
另一个建议:如果您在此部分中使用实例变量,请不要将局部变量发送到部分
# render partial
render 'form', reconciliation: @reconciliation
# partial with form for local variable
simple_form_for reconciliation
Run Code Online (Sandbox Code Playgroud)
我认为由于硬编码的 url,您的表单部分不适用于编辑操作,您可以在变量中传递 url:
# new html
render 'form', reconciliation: @reconciliation, url_var: location_reconciliations(@location)
# edit
render 'form', reconciliation: @reconciliation, url_var: reconciliations(@reconciliation)
# form
simple_form_for reconciliation, url: url_var
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
173 次 |
最近记录: |