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

実際にbelongs_to :productは、モデル (LineItem) にこの属性を与えるものです。これで、(この LineItem が属している) 親製品を参照できLineItem.find(1).product_idますLineItem.find(1).product.id

Rails は、この従来の属性 (product_id) を使用して、テーブルの列に直接マップします。schema.rb ファイルを確認すると、line_items テーブル内にあります。

于 2012-10-02T21:00:30.327 に答える
1

これはおそらく、 を期待するルートがproduct_idあり、「カートに追加」リンクがそのルートの URL にリンクしておりproduct、その URL で の ID を渡していることを意味します。私は、することline_items_path(product_id: product)はすることと同じだと信じていline_items_path(product_id: product.id)ます。

于 2012-10-02T20:51:37.793 に答える
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[] が必要です)。この代替の、より json に似たハッシュ構文が ruby​​ 1.9 で追加されました。

于 2012-10-02T21:01:06.337 に答える
0

メソッドが呼び出さ#to_paramれ、デフォルトで ID が返されます。

System.out.println(anObject)あなたがJavaから来ているので、暗黙的に#toString()メソッドを呼び出すときと似ていると思います

于 2012-10-02T20:51:26.970 に答える