【问题标题】:Association! Why So Nil?协会!为什么这么零?
【发布时间】:2012-03-10 22:07:57
【问题描述】:

我正在尝试将这些模型与 create bar action 相关联。

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

所以,我搜索了答案,但没有一个人清楚地解释为什么会出现这个错误:Called id for nil,这会错误地是 4 -- 如果你真的想要 nil 的 id,请使用 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>

【问题讨论】:

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


【解决方案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 对象添加到用户的集合中(其中new 不会添加该对象直到实际保存为止)。

【讨论】:

  • 将您的呼叫更改为@bar.save!(带有感叹号),然后将您的原始帖子附加到您的日志中输出的错误(可能在log/development.log中。我需要知道哪个id它正在寻找。
  • 来吧!在 2012-03-10 20:28:37 -0300 开始 POST "/bars" for 127.0.0.1 由 BarsController#create 作为 HTML 参数处理:{"utf8"=>"✓", "authenticity_token"=>"fLI8ffLhMXWklCy7CMZWBxIvqfbBKi6Al5vo269FyYM= ", "bar"=>{"name"=>"sssss", "type"=>{"style"=>"Pub"}}, "commit"=>"Create"} [1m[35mUser Load (0.2 ms)[0m SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'pwXhuBLyjau1OEdaTxKuvw' LIMIT 1 [1m[36mBar Load (13.5ms)[0m [1mSELECT "bars".* FROM "bars" WHERE "bars"."user_id" = 11 LIMIT 1[0m
  • Completed 500 Internal Server Error in 16ms RuntimeError (Called id for nil, 错误地是 4 -- 如果你真的想要 nil 的 id,使用 object_id): app/controllers/bars_controller.rb: 17:在“创建”中
  • 如果我使用 Object_id 创建但不关联,这就是为什么这个 nil 看起来是一个 nilness!
  • 你真的应该在做任何其他事情之前更改模型名称。使用“类型”作为模型名称(或列名称)可能会导致难以追踪问题。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2016-11-15
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多