来自Java,一种高度明确的语言,使用非常简洁的语法的RoR,大部分都很容易,但我很难理解幕后发生的一些事情。 / p>
在下面的代码中,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
答案 0 :(得分:1)
这可能意味着您的路线需要product_id
,而“添加到购物车”链接会链接到该路线的网址,并在该网址中传递product
的ID。我相信做line_items_path(product_id: product)
和做line_items_path(product_id: product.id)
是一样的。
答案 1 :(得分:1)
实际上,belongs_to :product
是为您的模型(LineItem)提供此属性的原因。所以现在你可以引用父产品(这个LineItem所属的产品),例如LineItem.find(1).product_id
,它将返回与执行LineItem.find(1).product.id
相同的内容。
Rails使用这个传统属性(product_id),因为它直接映射到表列。检查你的schema.rb文件,你会在line_items表中找到它。
答案 2 :(得分:0)
它将调用#to_param
方法,默认情况下返回id。
当你来自Java时,我会说它与你System.out.println(anObject)
隐式调用#toString()
方法
答案 3 :(得分:0)
product_id
是line_items_path
路由所期望的参数。您只需传递一个对象而不是手动设置它:
line_items_path(product)
结果应该相同。如果您在路线中重命名它,它会破坏您的视图,因此最好不要手动设置它。
答案 4 :(得分: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的散列语法。