Rails显示了动作,其中`id`没有在params中明确说明

时间:2013-11-19 22:30:02

标签: ruby-on-rails

在我的应用中,我有一个显示许多产品的视图。如果某个产品上有活跃的“交易”,则会为该交易提供该交易的链接,该交易会链接到该交易的show操作,如下所示。

<tr>
    <% @item.inventory_items.each do |p| %>
      <td><%= link_to image_tag("#{p.vendor.image_url}"), vendor_path(p.vendor) %></td>
      <td class="price">$<%= p.price %></td>
      <td>
        <% if Deal.where(:product_code => p.product_code, :vendor_id => p.vendor_id).exists? %>
          <%= link_to "See It!", deal_path(Deal.where(:product_code => p.product_code, :vendor_id => p.vendor_id)) %>

        <% else %>
        <% end %>
      </td>
      <td>
       ......
      </td>
</tr> 

我遇到的问题是我对交易的show行动正在考虑交易id。这个交易ID并不是真正的参数,所以我怎么能告诉这个交易展示行动哪个交易我感兴趣?提前致谢!顺便说一句,我的上面的代码在我的if块中感觉非常冗长且非常类似于轨道。如果您对此有任何建议,我们非常感谢您的建议。

交易/ show.html.erb

<%= link_to image_tag("#{@deal.vendor.image}") %>
<%= @deal.vendor.address %>
<%= image_tag(@deal.image) %>

交易展示行动:

def show
    @deal = Deal.find(params[:id])
end

2 个答案:

答案 0 :(得分:2)

尝试

            <%= link_to "See It!", deal_path(Deal.where(:product_code => p.product_code, :vendor_id => p.vendor_id).first) %>

答案 1 :(得分:2)

你的代码肯定不是很像铁轨。

你应该做的是这样的事情:

<tr>
        <% @item.inventory_items.each do |p| %>
          <td><%= link_to image_tag("#{p.vendor.image_url}"), vendor_path(p.vendor) %></td>
          <td class="price">$<%= p.price %></td>
          <td>
            <% if p.deal.exists? %>
              <%= link_to "See It!", deal_path(:id => p.deal.id)) %>

            <% else %>
            <% end %>
          </td>
          <td>
           ......
          </td>
    </tr> 

请注意,您可以在link_to中传递参数。请参阅此问题 - link_to send parameters along with the url and grab them on target page

如果您的模型设置正确,则不必在视图中进行查询。