【问题标题】:Accessing and using an extra parameter in Rails nested routes在 Rails 嵌套路由中访问和使用额外参数
【发布时间】:2015-07-15 00:17:18
【问题描述】:

我有一个 Rails 电子商务应用程序,可以在其中创建订单,然后将商品添加到订单中。

Order 属于用户,我有一个 OrderItem,它是 Orders 和 Items 的连接表。任何用户都可以为其他用户创建订单。

routes.rb

  resources :items

  resources :users, only: [:show] do
    resources :orders do
      resources :order_items, only: [:create, :update, :destroy]
    end

order#show 呈现一个包含所有项目的部分,并带有一个用于将 OrderItem 添加到 Order 的按钮

<%= render partial: 'order_items/new', locals: { user: @user, order: @order} %>

这里是部分视图/order_items/_new.html.erb

<h3>Add Items</h3>
<% @items.each do |item| %>
    <div>
        <%= item.name %>
        <%= render 'order_items/add', locals: { user: @user, order: @order, item: @item} %>
    </div>
<% end %>

然后是部分order_items/_add.html.erb

<%= form_for [@user, @order, @order.order_items.build] do |f| %>
    <%= f.submit 'Add Item', class: 'btn' %>
<% end %>

这将创建 OrderItem,但 item_id 为 nil。所以我必须像这样传入 item_id 参数:

<%= f.hidden_field :item_id, :value => item.id %>

但问题是我无法访问表单中的项目。最好的方法是什么?

【问题讨论】:

    标签: ruby-on-rails forms routes nested


    【解决方案1】:

    你可以这样做:

    <%= form_for [@user, @order, @order.order_items.build(item_id: @item.id)] do |f| %>
      #....
    <% end %>
    

    ...或者如果您需要查看项目名称(或任何其他属性)

    <%= form_for [@user, @order, @order.order_items.build(item_id: @item.id)] do |f| %>
      <%= f.label @item.name #or whatever attribute you need to see %>
    <% end %>
    

    【讨论】:

    • 似乎无法以部分形式访问@item。这是在views/order_items/_new.html.erb中呈现部分的行:&lt;%= render 'order_items/add', locals: { user: @user, order: @order, item: @item} %&gt;我得到一个NoMethodError for 'id' for nil:NilClass for @item.id
    【解决方案2】:

    我正在取消第二部分,只是将表单直接放入 view/order_items/_new.html.erb

    <h3>Add Items</h3>
    <% @items.each do |item| %>
        <div>
            <%= item.name %>
            <%= form_for [@user, @order, @order.order_items.build(:item_id => item.id)] do |f| %>
      <%= f.label @item.name #or whatever attribute you need to see %>
    <% end %>
        </div>
    <% end %>
    

    _form 部分没有看到局部变量@item 很奇怪,但我现在意识到我真的不需要将表单放在部分中。

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2017-09-03
      相关资源
      最近更新 更多