Simple_Form,嵌套资源和Rails 5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Simple_Form,嵌套资源和Rails 5相关的知识,希望对你有一定的参考价值。

我试图让我的simple_form在嵌套资源上工作,它是不合作的。

这些是我的模特:

location.rb

# == Schema Information
#
# Table name: locations
#
#  id         :integer          not null, primary key
#  name       :string
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Location < ApplicationRecord
  has_many :inventory_items, inverse_of: :location
  accepts_nested_attributes_for :inventory_items
end

inventory_item.rb

# == Schema Information
#
# Table name: inventory_items
#
#  id                    :integer          not null, primary key
#  product_id            :integer
#  location_id           :integer
#  created_at            :datetime         not null
#  updated_at            :datetime         not null
#

class InventoryItem < ApplicationRecord
  belongs_to :product
  belongs_to :location, inverse_of: :inventory_items
end

这些是我的routes.rb

  resources :locations, shallow: true do
    resources :inventory_items
  end

在这条路上:app/views/inventory_items/_form.html.erb,我有以下几点:

<%= simple_form_for [@location, @inventory_item] do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :product, collection: Product.all %>
    <%= f.input :location, as: :hidden, value: @location %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, class: "btn btn-outline-primary" %>
  </div>
<% end %>

在我的InventoryItemsController中,我有这个:

  # GET /inventory_items/new
  def new
    @location = Location.find(params[:location_id])
    @inventory_item = InventoryItem.new
  end

  def create
    @inventory_item = InventoryItem.new(inventory_item_params)

    respond_to do |format|
      if @inventory_item.save
        format.html { redirect_to @inventory_item, notice: 'Inventory item was successfully created.' }
        format.json { render :show, status: :created, location: @inventory_item }
      else
        format.html { render :new }
        format.json { render json: @inventory_item.errors, status: :unprocessable_entity }
      end
    end
  end

在我的InventoryItemsController中我强大的参数看起来像这样:

def inventory_item_params
  params.require(:inventory_item).permit(:product_id, :location_id)
end

这是我得到的错误:

Started POST "/locations/2/inventory_items" for 127.0.0.1 at 2018-02-28 02:12:08 -0500
Processing by InventoryItemsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"b37LkH+LTE/SCX6aepLQ==", "inventory_item"=>{"product"=>"1", "location"=>""}, "commit"=>"Create Inventory item", "location_id"=>"2"}
Unpermitted parameters: :product, :location
   (0.9ms)  BEGIN
   (1.1ms)  ROLLBACK
  Rendering inventory_items/new.html.erb within layouts/application
  Rendered inventory_items/_form.html.erb (209.3ms)
  Rendered inventory_items/new.html.erb within layouts/application (212.6ms)
Completed 500 Internal Server Error in 234ms (ActiveRecord: 2.0ms)

ActionView::Template::Error (undefined method `inventory_items_path' for #<#<Class:0x00007fb7cfeac4d0>:0x00007fb7d61c9630>
Did you mean?  inventory_item_path
               inventory_item_url):
    1: 
    2: <%= simple_form_for [@location, @inventory_item] do |f| %>
    3:   <%= f.error_notification %>
    4: 
    5:   <div class="form-inputs">

app/views/inventory_items/_form.html.erb:2:in `_app_views_inventory_items__form_html_erb__1010261120264584503_70213786161420'
app/views/inventory_items/new.html.erb:3:in `_app_views_inventory_items_new_html_erb__2144225759246708939_70213756146940'
app/controllers/inventory_items_controller.rb:35:in `block (2 levels) in create'
app/controllers/inventory_items_controller.rb:30:in `create'
Started PUT "/__web_console/repl_sessions/26d29444d640e5a02342d073be65f513" for 127.0.0.1 at 2018-02-28 02:12:31 -0500
Started PUT "/__web_console/repl_sessions/26d29444d640e5a02342d073be65f513" for 127.0.0.1 at 2018-02-28 02:12:33 -0500

我正在使用Rails 5.1和Simple Form 3.5.1。

编辑1

我尝试将_form.html.erb部分更改为:

<%= simple_form_for @inventory_item do |f| %>

我仍然得到相同/类似的错误:

Started GET "/locations/2/inventory_items/new" for 127.0.0.1 at 2018-02-28 13:07:01 -0500
Processing by InventoryItemsController#new as HTML
  Parameters: {"location_id"=>"2"}
  Location Load (1.4ms)  SELECT  "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  Rendering inventory_items/new.html.erb within layouts/application
  Rendered inventory_items/_form.html.erb (180.4ms)
  Rendered inventory_items/new.html.erb within layouts/application (182.9ms)
Completed 500 Internal Server Error in 194ms (ActiveRecord: 1.4ms)



ActionView::Template::Error (undefined method `inventory_items_path' for #<#<Class:0x00007fb7cfeac4d0>:0x00007fb7d78025c8>
Did you mean?  inventory_item_path
               inventory_item_url):
    1: 
    2: <%= simple_form_for @inventory_item do |f| %>
    3:   <%= f.error_notification %>
    4: 
    5:   <div class="form-inputs">

app/views/inventory_items/_form.html.erb:2:in `_app_views_inventory_items__form_html_erb__1010261120264584503_70213731033440'
app/views/inventory_items/new.html.erb:3:in `_app_views_inventory_items_new_html_erb__2144225759246708939_70213785622700'
答案

变化:app/views/inventory_items/_form.html.erb

<%= simple_form_for @inventory_item do |f| %>
另一答案

似乎正确的答案就是将url:选项添加到simple_form_for辅助方法并将f.input的名称更改为:product_id

所以我的_form.html.erb的最终版本看起来像这样:

<%= simple_form_for @inventory_item, url: :location_inventory_items do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :product_id, collection: Product.all %>
    <%= f.input :location_id, as: :hidden, value: @location %>
    <%#= f.input_field :avatar, as: :hidden, value: @profile.cached_avatar_data, class: 'col-lg-4 form-control '%>
  </div>

  <div class="form-actions">
    <%= f.button :submit, class: "btn btn-outline-primary" %>
  </div>
<% end %>

以上是关于Simple_Form,嵌套资源和Rails 5的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5 simple_form 将单选按钮标记为必需,如果未填写则阻止提交表单

无法让 rails 搜索表单与 simple_form 和 sunspot 一起使用

如何避免Rails 5嵌套资源命名空间路由中的双下划线

Rails 使用 select2(和 simple_form)作为可标记

具有自定义关联的Rails,simple_form和nested_models

rails,simple_form,保存后如何使用所选选项更新单选按钮?