我是RoR的初学者,我在使用某些模特时遇到了问题。
基本上我在产品票预订之间有一个关系。 产品通过门票预订,反之亦然。
我还有一个供应商,其中has_many:products和has_many:reservation。
我想要做的是在用户选择供应商并看到它的产品后,他可以从该供应商中选择他想要的产品。
在那个reservations.new我得到了一个表单但是因为在“提交”操作后我必须在2个模型中插入数据,我遇到了问题。
当我创建预订时,应该同时创建预订条目和票证条目,票证条目将具有reservation_id和product_id作为外键。
我的预订'视图:
<%= form_for(@reservation) do |f| %>
Reservation Info
<div id="reservation_top"></div>
<div id="reservation">
<%= f.label :name %><br />
<%= f.text_field :name %>
<%= f.label :surname %><br />
<%= f.text_field :surname %>
(...)
<%= f.hidden_field :supplier_id, :value => @reservation.supplier_id %> #to get the supplier ID
Products:
<%= f.fields_for :tickets do |t| %>
<%= t.select("product_id",options_from_collection_for_select(@products, :id, :name))%>
#I also have another t.select and although this isn't my primary concern, I wanted this t.select option's to change according to what is selected on the previous t.select("product_id"). Something like a postback. How is it done in RoR? I've searched and only found observe_field, but I didn't understand it very much, can you point me in the right direction? thanks
<%end%>
<%= f.label :comments %>
<%= f.text_area :comments %>
<%= f.submit%>
<%end%>
现在我觉得问题出在我的控制器上,但我无法理解放在那里的东西,我现在有:
def new
@supplier=Supplier.find(params[:supplier_id])
@reservation = Reservation.new(:supplier_id => params[:supplier_id])
@ticket = Ticket.new(:reservation_id => params[@reservation.id])
@products = Supplier.find(params[:supplier_id]).products
@ticket = @reservation.tickets.build
respond_to do |format|
format.html
format.json { render :json => @reservation }
end
end
def create
@reservation = Reservation.new(params[:reservation])
respond_to do |format|
if @reservation.save
@reservation.tickets << @ticket
format.html { redirect_to @reservation, :notice => 'Reservation Successful' }
else
format.html { render :action => "new" }
format.json { render :json => @reservation.errors, :status => :unprocessable_entity }
end
end
我现在正在接受
Called id for nil, which would mistakenly be 4
是因为它正在尝试创建故障单并且没有reservation_id吗?
我以前从未处理过habtm协会。有什么提示吗?
提前致谢, 此致
答案 0 :(得分:1)
在日志中查看创建操作的POST参数。这将在您保存数据时准确显示您需要使用params处理的数据。
在
def create
@reservation = Reservation.new(params[:reservation])
respond_to do |format|
if @reservation.save
@reservation.tickets << @ticket
那时@ticket是什么? (我相信你的意思是零)
我认为在生成响应之前,看看你的新方法中的@reservation和@ticket是什么样子也很有趣...记录每个对象的.inspect以确保你有你的想法你有。
在一个比你更复杂的保存中,我会将它全部包装在交易中。