Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails如何确定这个id';s值多少?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails如何确定这个id';s值多少?

Ruby on rails Rails如何确定这个id';s值多少?,ruby-on-rails,ruby,Ruby On Rails,Ruby,从高度显式的Java语言到使用非常简洁语法的RoR,在很大程度上是很容易的,但我很难理解幕后发生的一些事情 在下面的代码中,Rails如何分配产品id:值?不能改用product.id吗?产品id:在本文中的确切含义是什么?它的价值从何而来 他认为: <% @products.each do |product| %> <div class="entry"> <%= image_tag(product.image_url) %> <h3><%=

从高度显式的Java语言到使用非常简洁语法的RoR,在很大程度上是很容易的,但我很难理解幕后发生的一些事情

在下面的代码中,Rails如何分配产品id:值?不能改用product.id吗?产品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 %>

这是因为我在我的行项目模型中给出了attr\u accessible语句吗

class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id
  belongs_to :product
  belongs_to :cart
end
class LineItem
它将调用
#to_param
方法,默认情况下该方法返回id


由于您来自Java,我想说这与您使用
System.out.println(anObject)
时类似,它隐式调用
#toString()
方法

这可能意味着您有一个需要
产品id
的路由,“添加到购物车”链接链接到该路由的URL,并在该URL中传递
产品
的id。我相信做
line\u items\u path(product\u id:product)
与做
line\u items\u path(product\u id:product.id)
是一样的

product\u id
line\u items\u path
路由所需的参数。您可以只传递对象,而不是手动设置:

line_items_path(product)

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

实际上,
属于:product
是您的模型(LineItem)的此属性。因此,现在您可以通过执行例如
LineItem.find(1).product\u id
,来引用父产品(该行项目所属),这将返回与执行
LineItem.find(1).product.id
相同的结果

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

line_items_path(product_id: product)
相当于

line_items_path(:product_id => product)
这和

line_items_path({:product_id => product})

在这种特定情况下,
产品\u id
的行为类似于符号文字(通常需要前导的
或%s[])。ruby 1.9中添加了这种类似json的哈希语法。

此外,您可能有一个文件
app/controllers/line\u items\u controller.rb
,其中至少有一个操作处理
产品id
。该文件可能会告诉您比
LineItem
模型更多的信息。是的,我会在
line\u items\u controller.rb
中查看
def create
。几乎可以肯定的是,当点击“添加到购物车”链接时,会被称为“添加到购物车”。可能您已经知道了。LineItem.find(1)。product_id将返回存储在LineItem表中的产品id。因此,如果产品以某种方式从产品表LineItem.find(1)中删除,则Product.id将引发错误,因为LineItem.Product=nil和nil.id因此未定义(无法使用LineItem中指定的id检索对象),因此它可以返回相同的但并非所有用于引发此旧帖子的CaseSorry,但是为什么我们不能编写
行项目路径(product.id)
而不是
行项目路径(product\u id:product)
?因为参数必须是散列?因为在一般情况下,rails不知道您给它的id引用了一个产品(取决于路由是如何定义的)