在我的产品视图下面,我有2个属性,我想通过photo.id传递 type.id和size.id
它们将全部保存在同一个订单项
中button_to是一个远程操作,因此在按下按钮后它不会离开页面。
在line_items控制器中添加要传递给create的属性的最佳方法是什么?
产品视图
%b Paper Type
= select(:type_id, :type, options_from_collection_for_select_with_attributes(Type.all, 'id', 'name', 'data-price', 'price'), { :include_blank=>false }, {:class => 'vars'})
%p
%b Paper Size
= select(:type_id, :type, options_from_collection_for_select_with_attributes(Size.all, 'id', 'name', 'data-price', 'price'), { :include_blank=>false }, {:class => 'vars'})
%p
%b Total:
%span#total
%input{:type=>"hidden", value: @photo.price, name: 'price', id: 'baseprice'}
= number_to_currency (@photo.price)
%br
= button_to 'Add to Cart', line_items_path(photo_id: @photo.id), remote: true
%br
订单项控制器
def create
photo = Photo.find(params[:photo_id])
@line_item = @cart.add_product(photo.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart }
format.js { @current_item = @line_item }
format.json { render action: 'show', status: :created, location: @line_item }
else
format.html { render action: 'new' }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
cart.rb模型
def add_product(photo_id)
current_item = line_items.find_by(photo_id: photo_id)
if current_item
current_item.quantity = current_item.quantity.to_i + 1
else
current_item = line_items.build(photo_id: photo_id, quantity: 1)
end
current_item
end
购物车初始化程序问题/ current_cart.rb
def set_cart
@cart = Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
@cart = Cart.create
session[:cart_id] = @cart.id
end
编辑:添加购物车初始化程序和add_product方法
答案 0 :(得分:1)
button_to
似乎能够将params传递给该方法,然后将其呈现为hidden fields
:
这意味着应该能够将您的额外属性作为button_to
方法中的参数传递 - 允许您在控制器后端处理它们:
<%= button_to line_items_path(photo_id: @photo.id, type_id: "X", size_id: "Y") %>
-
<强>表格强>
这个问题是你只能传递参数static
。我看到你能够选择它们,这完全适合form
(特别是form_tag
):
<%= form_tag line_items_path(photo_id: @photo.id) do %>
<%= select_tag :type_id .....%>
<%= select_tag :size_id .....%>
<%= submit_tag "Save" %>
<% end %>
此允许您将您需要的参数发送到button_to
帮助程序范围之外的应用程序,以便在后端处理以下内容:
params[:type_id]
params[:size_id]
etc