协会!为什么这么无?

时间:2012-03-10 22:07:58

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems

我正在尝试将这些模型与 创建栏操作相关联。

我知道bar和type都是没有创建的nil对象,但为什么,ruby不明白我想要的只是绑定这些nil对象?

所以,我搜索了答案,但没有一个人清楚地解释了为什么会出现这个错误:调用id为nil,这将错误地为4 - 如果你真的想要id为nil,请使用object_id

发生在这种情况下。

用户 - 模型

has_one :bar

栏 - 模型

belongs_to :type
belongs_to :user

类型 - 型号

has_many :bars

栏 - 控制器

  def new
      @bar = Bar.new
    end

    def create
      @bar = current_user.build_bar(params[:bar].merge(:type_id => @type.id))
           if  @bar.save     
           flash.now[:success] = "Wohoo!"
             redirect_to @bar
            else
             render  :new 
           end
         end

New_bar - 查看

<div class="block">

        <%= render 'shared/flash_messages' %>

        <%= form_for @bar, :url =>  bars_path, :method => :post  do |b| %>
    <ul>
    <li><%= b.label :name %><%= b.text_field :name %></li>

    <%= b.fields_for :type  do |t| %>

    <li>pirate:<%= t.radio_button :style, "pirate" %></li>
    <li>pub:<%= t.radio_button :style, "pub" %></li>
    <li>american:<%= t.radio_button :style, "american" %></li>
    </ul>
    <% end %>

    <%= b.submit "create", :class => "sec button" %>
    <% end %>
    </div>

1 个答案:

答案 0 :(得分:1)

尝试构建这样的bar对象:

@bar = current_user.bar.new params[:bar].merge(:type_id => @type.id)

确保在拨打该线路时同时拥有current_user对象和@type对象。

对于记录,current_user.bar.newcurrent_user.bar.build之间的唯一区别是build在保存之前将新创建的bar对象添加到用户的集合中(其中为{在实际保存之前,{1}}不会将对象添加到用户。