查看更新的1以下& 2解决方案将产品添加到购物车
我已经从书“敏捷Web开发使用Rails”创建购物车以下教程。他们有一章我一直在以下位置:http://media.pragprog.com/titles/rails4/cart.pdf
在这本书中,他们让你创建一个获得真实传递到车,并通过这条线<%= button_to“添加到购物车”,line_items_path存储在会话LINE_ITEM(产品:product)%>这在我的情况下显然会更改为<%= button_to',line_items_path(gear_id:齿轮),ID: 'rent_it' %>
如果我想改变这种做法,它也接受其他参数我会怎么做这一种形式?
下面是我的代码,我已经使用并尝试完成此操作,但目前为止尚未成功。 用下面的代码,我得到和错误,不能找到没有'身份证'的装备。我是新来的铁路和编程一般,所以我感谢帮助。
更新1(我更新下面还有我的视图)
现在我可以从我传递齿轮的ID形式我的服务器日志中看到。这是我最初试图做的。
Processing by LineItemsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0QnJShABOV+avPx0AJHxuMmskfwtwFlkpMa6cBhTU3s=", "line_item"=>{"rentstart"=>"", "rentend"=>"", "gear_id"=>"13"}, "commit"=>""}
Cart Load (0.4ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 18 LIMIT 1
Completed 500 Internal Server Error in 2ms
ActiveRecord::RecordNotFound (Couldn't find Gear without an ID):
app/controllers/line_items_controller.rb:44:in `create'
我仍然收到错误找不到没有ID的齿轮。下面是两行:
gear = Gear.find(params[:gear_id])
@line_item = @cart.add_gear(gear.id)
我在想什么?
行项目的控制器
def create
@cart = current_cart
gear = Gear.find(params[:gear_id])
@line_item = @cart.add_gear(gear.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart }
format.json { render json: @line_item, status: :created, location: @line_item }
else
format.html { render action: "new" }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
车型号
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_gear(gear_id)
current_item = line_items.find_by_gear_id(gear_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(params[:line_item])
end
current_item
end
def total_price
line_items.to_a.sum { |item| item.total_price }
end
end
查看从齿轮显示页面
<div class="gearside_date_main">
<h3>Rental Date</h3>
<script>
$(function() {
var dates = $("#rentstart, #rentend").datepicker({
defaultDate: "+1w",
changeMonth: true,
numberOfMonths: 1,
onSelect: function(selectedDate) {
var option = this.id == "rentstart" ? "minDate" : "maxDate",
instance = $(this).data("datepicker"),
date = $.datepicker.parseDate(
instance.settings.dateFormat ||
$.datepicker._defaults.dateFormat,
selectedDate, instance.settings);
dates.not(this).datepicker("option", option, date);
}
});
});
</script>
<%= form_for LineItem.new do |f| %>
<%= f.text_field :rentstart, id: 'rentstart' %>
<%= f.text_field :rentend, id: 'rentend' %>
<%= f.hidden_field :gear_id, :value => @gear.id %>
<%= f.submit "", id: 'rent_it' %>
<% end %>
<% end %>
</div>
UPDATE 2
在Murifox的评论后,我终于得到了它的工作。我没有完全理解传递散列时语法的结构。所以经过多次试验和错误后,它正在工作。我在下面列出了我的更新代码,以查看我所做的更改。我知道,当我看到答案时,我总是在寻找变化。我希望这可以帮助别人....
的视图(齿轮显示页面
<%= form_for LineItem.new do |f| %>
<%= f.text_field :rentstart, id: 'rentstart' %>
<%= f.text_field :rentend, id: 'rentend' %>
<%= f.hidden_field :gear_id, :value => @gear.id %>
<%= f.submit "", id: 'rent_it' %>
<% end %>
的控制器(创建操作)
def create
@cart = current_cart
gear = Gear.find(params[:line_item][:gear_id])
lineitem = params[:line_item]
@line_item = @cart.add_gear(lineitem, gear.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart }
format.json { render json: @line_item, status: :created, location: @line_item }
else
format.html { render action: "new" }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
的车型号
def add_gear(lineitem, gear_id)
current_item = line_items.find_by_gear_id(gear_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(lineitem)
end
current_item
end
我得到以下错误,如果我使用上面的行:“NameError在LineItemsController#创建 未定义局部变量或方法'PARAMS”为#<购物车:0x007ff8d67088f8>” – DaveG
噢,我假定这段代码在控制器中。要在您的购物车模型中访问参数散列,您必须通过方法参数传递它。 – MurifoX
呃...代码在我的控制器中。一旦我提交表单,我向你展示的错误就是来自视图。仍然有点困惑。马上obrigado para sua resposta。 Espero que tudo esta bom la in Brasil。 – DaveG