添加.name后,我得到nil的未定义方法`name':NilClass

时间:2013-06-07 18:48:02

标签: ruby-on-rails

我正在关注skillshare.com上的一个月Rails课程并遇到了一个我自己无法修复的问题。

我正在创建一个类似于pinterest的简单应用。我正处于一个步骤,我们试图在他们发布图片后在他们的照片下获得用户名。它会说“发布者:(姓名)。”

这是我的代码有错误:

<div class="box">
<%= link_to (image_tag pin.image(:medium)), pin %>
<p class="description">
    <%= pin.description %>
</p>
<p>
    <strong>
        Posted by: <%= pin.user.name %>
    </strong>
</p>
<% if current_user == pin.user %>
    <p>
      <%= link_to 'Edit', edit_pin_path(pin) %>
      <%= link_to 'Destroy', pin, method: :delete, data: { confirm: 'Are you sure?' } %>
    </p>
<% end %>

在强标签之间的中心,我有“发布者:&lt;%= pin.user.name%&gt;”。我尝试取出.name并且我的网站将加载而没有“未定义的方法”名称“”但我得到了一堆笨拙的数字(我猜这是ruby或rails定义用户的那个,然后将名称分配给那个现在正在显示一批数字。)

我的猜测是我需要在某处定义.name,我不太确定在哪里或如何做。如果有人能看到这个我会很感激。谢谢!

**我刚刚在show.html.erb文件中找到了这段代码

<div class"row">
    <div class="span6 offset3">
        <div class="well">
            <%= image_tag @pin.image %>
            <%= @pin.description %>
            <p>
              <%= @pin.user.name %>
            </p>
            <% if current_user == @pin.user %>
            <%= link_to 'Edit', edit_pin_path(@pin) %> 
            <% end %>|
            <%= link_to 'Back', pins_path %>
        </div>
    </div>
</div>

pin.user.name适用于这种情况,但我仍然无法在上面的第一段代码中使用它。

模型/ user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :rememberable, :trackable, :validatable #recoverable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name
  # attr_accessible :title, :body

  has_many :pins, :dependent => :destroy
end

3 个答案:

答案 0 :(得分:0)

我猜你有一些pin条记录,没有user_id。您应该使用rails控制台(rails c)并使用以下语句来检查:

Pin.where(:user_id => nil)

向您的用户模型添加validates :user_id, :presence => true之类的内容,以确保pin有相应的用户。

答案 1 :(得分:0)

好的,所以我们已经确定这应该是部分的。在这种情况下,您需要传入要渲染的form_for变量。我可能不正确,但我相信你的意思如下。这将在模型对象周围创建一个表单和一个范围。因此,在这种情况下,我相信您将拥有以下内容:

   <%= form_for(@pin) do |f| %>
    <div class="box">
    <%= link_to (image_tag pin.image(:medium)), pin %>
    <p class="description">
        <%= pin.description %>
    </p>
    <p>
        <strong>
            Posted by: <%= pin.user.name %>
        </strong>
        <% end %> 
    </p>
    <% if current_user == pin.user %>
        <p>
          <%= link_to 'Edit', edit_pin_path(pin) %>
          <%= link_to 'Destroy', pin, method: :delete, data: 
                                     { confirm: 'Are you sure?' } %>
        </p>
    <% end %> 
  <% end %> 

您可以阅读Ruby on Rails Guide - Using Partials

答案 2 :(得分:0)

我也在上这门课。有另一个问题,但阅读课堂材料有一些明确的步骤来纠正:

故障排除注意:您应该删除没有与之关联的用户的任何引脚,否则当您尝试加载引脚索引页时,您将获得nil的未定义方法'name':NilClass错误。请按照以下步骤操作:

$ rails console
>> Pin.destroy_all(user_id: nil)
$ heroku run rails console
>> Pin.destroy_all(user_id: nil)