Ruby on Rails:将特定的.each值传递给方法

时间:2014-07-21 16:21:53

标签: ruby-on-rails ruby-on-rails-4

很抱歉,如果这是非常明显的,我有点新,但无法在任何地方找到这个答案。

我正在尝试创建一个按钮,在索引视图中将项目数量增加一个。

我有一个包含列的简单表项:| name | brand | type | Quantity |

我的控制器:

def index
    @items = Item.all
end
def incr_quantity
  Item.find(params[:id]).increment!(:quantity, by = 1)
end

在我看来,我的每个项目旁边都有3个选项:

  <% @items.each do |item| %>
      <tr>
        <td><%= image_tag(item.profile_url(:thumb)) %></td>
        <td><%= item.name %></td>
        <td><%= item.brand %></td>
        <td><%= item.type %></td>
        <td><%= item.quantity %></td>
        <td><%= link_to 'Edit', edit_item_path(item) %></td>
        <td><%= link_to 'Delete', item_path(item), method: :delete, data: {confirm: 'Are you sure?'} %></td>
        <td><%= link_to 'Use 1 Item',item_incr_quantity_path(item), method: :post %></td>

      </tr>
  <% end %>
</table>

您可能已经猜到我收到错误&#34;无法找到没有ID的项目&#34;每当我点击超链接&#34;使用1项&#34;,但我无法弄清楚如何传递他们点击的索引表中项目的特定项目ID。

正如所指出的那样:我应该包含我的路线文件以帮助更好地回答这个问题:

resources :items do
  post "incr_quantity"
end 

并且请求看起来像这样:

    Parameters:

{"_method"=>"post",
 "authenticity_token"=>"XXXXXXXXXX",
 "item_id"=>"3"}

1 个答案:

答案 0 :(得分:3)

查看您定义指向item_incr_quantity_path (item)的链接的方式,我确信您已为incr_quantity定义了以下内容的路由:

resources :items do
  post "incr_quantity"
end 

这将为incr_quantity操作创建一条路线,如下所示:

item_incr_quantity POST    /items/:item_id/incr_quantity(.:format) items#incr_quantity

您可以通过运行rake routes命令来验证。

在这种情况下,您应该使用params[:item_id]而不是params[:id]

def incr_quantity
  Item.find(params[:item_id]).increment!(:quantity, by = 1)
end