Ruby on Rails - HABTM - 在一个控制器中将数据插入2个模型

时间:2012-06-15 13:44:59

标签: ruby-on-rails activerecord has-and-belongs-to-many

我是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协会。有什么提示吗?

提前致谢, 此致

1 个答案:

答案 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以确保你有你的想法你有。

在一个比你更复杂的保存中,我会将它全部包装在交易中。