2010-12-14 3 views

Trả lời

5

@product trong các tàu hỗ trợ form_for có nhiều tính năng hơn.

:product chỉ ảnh hưởng đến id và tên của trường nhập. Ví dụ bạn có một văn bản nộp theo hình thức:

<%= form_for :product, :url => {...} do |f| %> 
    <%= f.text_field :price %> 
<% end %> 

Các html tạo ra sẽ như thế nào:

<input type="text" id="product_price" name="product[price]" /> 

Giá trị idname được xác định bởi :product.to_s và tên trường văn bản.

Trong khi nếu bạn sử dụng @product, các :url là không cần thiết vì các url sẽ được xác định theo công 's @product status:

  • nếu @product là một kỷ lục mới, url sẽ gửi đến create
  • nếu không, url sẽ gửi đến update

và đầu vào đệ của id và tên bị ảnh hưởng bởi @product 's cl tên ass, vì vậy điều quan trọng là khi bạn đang sử dụng bảng kế thừa đơn. Giá trị của dữ liệu đầu vào được tự động gán với giá trị thuộc tính của @product.Vì vậy, nếu bạn sử dụng @product, sản lượng html sẽ trông như thế:

<input type="text" id="product_price" name="product[price]" value="some value" /> 

Giả sử tên lớp 's @productItem, sau đó đầu ra sẽ thay đổi để:

<input type="text" id="item_price" name="item[price]" value="some value" /> 

Và dĩ nhiên bạn có thể sử dụng cả hai :product@product:

<%= form_for :product, @product do |f| %> 

các :product điều khiển đầu vào đệ của tên và id, và @product kiểm soát giá trị của trường và giá trị của trường nhập.

+0

: sản phẩm cũng ảnh hưởng đến URL mà 'form_for' tạo ra. –

+0

Vâng, nhưng tôi không bao giờ sử dụng đối số biểu tượng mà không chỉ định ': url'. Trên thực tế, biểu tượng hiếm khi được sử dụng một mình. – Kevin

+0

Khi tôi sử dụng 'form_for (: sản phẩm, ...)' Tôi thấy các trường văn bản được điền bằng các giá trị '@ product'. Tuy nhiên, các hộp chọn sẽ nhận giá trị mặc định (tùy chọn đầu tiên). Bạn có bất cứ ý tưởng gì có thể sai? Xem thêm tại đây: http://stackoverflow.com/questions/4436267/ruby-on-rails-why-a-select-box-does-not-show-the-current-object-value –

2

Tương tự, nhưng không giống nhau. Khi bạn sử dụng @product, bạn có lợi ích khi có thể tự động điền các giá trị vào các trường biểu mẫu từ cá thể mô hình.

Ví dụ, nếu bạn trong hành động: mới trong điều khiển của bạn gán @product như thế này:

@product = Product.new 

Sau đó có thể sẽ không có bất kỳ sự khác biệt trong các hình thức tạo ra. Tuy nhiên, nếu bạn làm theo này lên trong bạn: tạo hành động như thế này:

@product = Product.new(params[:product]) 
if @product.save 
    ... 
else 
    render :action => :new 
end 

Sau đó, nếu nó không thể lưu các dụ @product, sau đó nó sẽ làm cho hình thức tương tự như trong: thời gian mới nhưng điều này có tất cả các trường được điền bằng các giá trị được đăng. Điều đó sẽ không thể thực hiện nếu bạn đã sử dụng: sản phẩm

+0

Bạn đã nghiên cứu điều này? ': product' cho tôi lấy biểu mẫu trên cùng một tuyến đường:'/products/new'. Tương tự với trang chỉnh sửa: '/ products/1/edit'. Tôi chỉ bối rối với câu trả lời của bạn, là tất cả. Nó mâu thuẫn với những gì tôi thực sự thấy trong * nghiên cứu của tôi *. –

+0

Tôi nghĩ chúng ta có thể nghĩ về những thứ khác nhau. Tôi đã không đề cập đến bất kỳ tuyến đường cụ thể, tôi chỉ mô tả sự khác biệt trong các hình thức khi sử dụng hai kịch bản khác nhau. Ví dụ về mới và tạo có thể đã bị đặt trong trường hợp này nhưng nó chỉ là một ví dụ về cách bạn có thể hưởng lợi từ việc sử dụng một cá thể thay vì ký hiệu. – DanneManne

+0

': product' cũng điền các trường văn bản cho tôi, giống như' @ product'. –

1

Đó là khá dài form_for bạn đã có mặt ở đó. Câu trả lời ngắn cho câu hỏi của bạn: @product hữu ích để xác định hành động nào cần thực hiện đối với tài nguyên có thể có nhiều đối tượng, điều này nghe giống như vậy. :product mặt khác sẽ luôn đi đến cùng một hành động, update. Điều này được sử dụng tốt nhất cho các tài nguyên số ít. Có thể tìm thấy giải thích tuyệt vời về các tài nguyên trong số Routing Guide. Nó cũng được giải thích trong hướng dẫn Getting Started.

bạn thứ hai form_for thể thiếu phải xuống này:

<%= form_for @product do |f| %> 
    ... 
<% end %> 

Tất cả được giải thích trong Routing and Bắt đầu hướng dẫn.

Ngoài ra, tôi thấy trong tiểu sử của bạn, bạn đến từ Melbourne. Có Ruby on Rails Oceania nhóm Google liệt kê các cuộc họp mặt trên khắp đất nước. Có một tháng ở Melbourne mà bạn có thể muốn tham dự để gặp gỡ những người có đầu óc.

+0

Tôi đã kiểm tra 'FormBuilder' và thấy rằng đó là biến cá thể' @ product' làm cho biểu tượng ': product' hoạt động như một đối tượng. nếu bạn thay đổi tên chữ '@ product' thành' @ myproduct', biểu tượng sẽ không tạo url, cũng như gán giá trị trường. Vì vậy, ý kiến ​​của tôi biểu tượng chỉ được sử dụng để kiểm soát id và tên của trường, và nên được sử dụng cùng với tùy chọn ': url'. – Kevin