0

从高度明确的语言 Java 到使用非常简洁的语法的 RoR 在大多数情况下很容易,但我很难理解幕后发生的一些事情。

在下面的代码中,Rails 如何为product_id:赋值?不能使用 product.id 代替吗?product_id:在这种情况下到底是什么意思?它的价值从何而来?

在视图中:

<% @products.each do |product| %>
<div class="entry">
<%= image_tag(product.image_url) %>
<h3><%= product.title %></h3>
<%= sanitize(product.description) %>
<div class="price_line">
  <span class="price"><%= number_to_currency(product.price, unit: '$') %></span>
  <%= button_to 'Add to Cart', line_items_path(product_id: product) %>
</div>
</div>
<% end %>

是因为我在 line_items 模型中给出的 attr_accessible 语句吗?:

class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id
  belongs_to :product
  belongs_to :cart
end
4

5 回答 5

1

这可能意味着您有一个需要 a 的路由product_id,并且“添加到购物车”链接链接到该路由的 URL,并在该 URL 中传递 id product。我相信做和做line_items_path(product_id: product)是一样的line_items_path(product_id: product.id)

于 2012-10-02T20:51:37.793 回答
1

实际上,belongs_to :product是什么给了你的模型(LineItem)这个属性。因此,现在您可以引用父产品(此 LineItem 所属的产品),例如LineItem.find(1).product_id,这将返回与 do 相同的结果LineItem.find(1).product.id

Rails 使用这个常规属性(product_id),因为它直接映射到表列。检查您的 schema.rb 文件,您会在 line_items 表中找到它。

于 2012-10-02T21:00:30.327 回答
0

它将调用该#to_param方法,该方法默认返回 id。

当您来自Java时,我会说它与您System.out.println(anObject)隐式调用该#toString()方法时类似

于 2012-10-02T20:51:26.970 回答
0

product_idline_items_path路由期望的参数。您可以只传递一个对象而不是手动设置它:

line_items_path(product)

结果应该是一样的。如果您在路线中重命名它,它会破坏您的视图,因此最好不要手动设置它。

于 2012-10-02T20:53:00.477 回答
0
line_items_path(product_id: product)

相当于

line_items_path(:product_id => product)

这与

line_items_path({:product_id => product})

在这种特定情况下product_id,其行为类似于符号文字(通常需要前导:或 %s[])。在 ruby​​ 1.9 中添加了这种替代的、更类似于 json 的哈希语法。

于 2012-10-02T21:01:06.337 回答