Rails如何确定此id的值?

时间:2012-10-02 20:46:25

标签: ruby-on-rails ruby

来自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

5 个答案:

答案 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_idline_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的散列语法。