【问题标题】:Undefined method 'id' for nil:NilClassnil:NilClass 的未定义方法“id”
【发布时间】:2015-02-17 19:40:10
【问题描述】:

我无法解决这个问题。我不断收到同样的错误: ActionView::Template::Error(nil:NilClass 的未定义方法 `id'):

这是我喜欢的控制器:

class LikesController < ApplicationController

def new
  @bookmark = Bookmark.find(params[:bookmark_id])
  @like = Like.new
end

  def create
    @bookmark = Bookmark.find(params[:bookmark_id])
    # @like = Like.new
    # @like.user = current_user
    # @like.bookmark = @bookmark
    @like = current_user.likes.build(bookmark: @bookmark)

    if @like.save
      flash[:notice] = "Bookmark was Liked!"
      redirect_to @bookmark
    else
      flash[:error] = "Unable to Like Bookmark"
      redirect_to @bookmark
    end
  end

  def destroy
    #@bookmark = Bookmark.find(params[:bookmark_id])
    @like = @bookmark.likes.find(params[:id])

    if @like.destroy
      flash[:notice] = "Bookmark was Un-liked."
      redirect_to @bookmark
    else
      flash[:error] = "Error Un-liking bookmark."
      redirect_to @bookmark
    end
  end

end

我的用户模型:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :topics
  has_many :bookmarks
  has_many :likes, dependent: :destroy

  def liked(bookmark)
    likes.where(bookmark: bookmark.id).first
  end
end

我喜欢的部分:

 <div>
  <% if like = current_user.liked(bookmark) %>
    <%= link_to [@topic, bookmark, like], class: 'btn btn-danger', method: :delete do %>
      <i class="glyphicon glyphicon-star-empty"> </i>&nbsp; Unlike
      <% end %>
    <% else %>
      <%= link_to [@topic, bookmark, Like.new], class: 'btn btn-primary', method: :post do %>
        <i class="glyphicon glyphicon-star"> </i>&nbsp; Like
      <% end %>
    <% end %>
  </div>

如果我需要显示其他内容,请告诉我,感谢您的帮助

【问题讨论】:

  • 哪个操作给了您错误?错误指向哪一行?
  • 错误指向:&lt;div&gt; &lt;% if like = current_user.liked(bookmark) %&gt; &lt;%= link_to [@topic, bookmark, like], class: 'btn btn-danger', method: :delete do %&gt; &lt;i class="glyphicon glyphicon-star-empty"&gt; &lt;/i&gt;&amp;nbsp; Unlike &lt;% end %&gt;
  • 具体到&lt;% if like = current_user.liked(bookmark) %&gt;这一行
  • 在我的rails控制台中,如果我拉出一个书签,它看起来像这样:=&gt; #&lt;Bookmark id: 1, url: "http://localhost:3000/topics/11/bookmarks/new", topi c_id: 11, created_at: "2015-02-17 19:28:17", updated_at: "2015-02-17 19:28:17", user_id: 1, bookmark_id: nil&gt; 2.0.0-p481 :003 &gt;所以开头有一个书签ID,但对于书签ID它仍然显示为nil?跨度>
  • 尝试将users.rb 中的liked 函数更改为Like.where(bookmark: bookmark.id).first

标签: ruby-on-rails


【解决方案1】:

从你调用部分的地方试试这个:

<% @bookmarks.each do |bookmark| %> 
  <%= render partial: 'likes/like', locals: {bookmark: bookmark} %> 
<% end %>

【讨论】:

  • 我从显示所有书签的书签部分调用它:&lt;div class="media-body"&gt; &lt;p&gt;&lt;%= link_to "{@bookmark.url}" %&gt;&lt;/p&gt; &lt;small&gt;&lt;%= link_to "Delete", [@topic, bookmark], method: :delete %&gt;&lt;/small&gt; &lt;%= render partial: 'likes/like', locals: {bookmark: @bookmark} %&gt;
  • 现在,您能否在部分顶部添加 并将响应粘贴到此处?想知道它是否获得书签。
  • 我把它放在我喜欢的部分中。这是错误:ActionView::Template::Error (nil): 1: &lt;%= raise bookmark.inspect %&gt; 2: &lt;div&gt; 3: &lt;% if like = current_user.liked(bookmark) %&gt; 4: &lt;%= link_to [@topic, bookmark, like], class: 'btn btn-danger', method : :delete do %&gt; app/views/likes/_like.html.erb:1:in _app_views_likes__like_html_erb___9154224 46_106013160' app/views/bookmarks/_bookmark.html.erb:6:in _app_views_bookmarks__bookmark_ht ml_erb___33832363_105997840' app/views/topics/show.html.erb:16:in _app_views_topics_show_html_erb__1179814 84_105692840'`
  • 你想让我使用 吗?
  • 我认为如果您也将模板粘贴到您的问题中会有所帮助,以及您尝试访问哪条路线?
【解决方案2】:

在你喜欢的部分中,你有:

<% if like = current_user.liked(bookmark) %>

= 应该是 ==。使用单个等于,您正在检查是否基于current_user.liked(bookmark) 为like 变量分配了一个真实值。你想要一个双等于来测试相等性。

更新 如果您真的要同时分配和比较,请将其分成两行,这样看起来像是故意的。这是“命令/查询分离原则”的一个缩影。

<% like = current_user.liked(bookmark) %>
<% if like %>

(抱歉,这可能与您的问题没有直接关系,但看到它非常分散注意力。)

【讨论】:

  • 将其更改为 == 给了我这个错误:undefined local variable or method like' for #:0xb8bd958>`
  • 她不是在比较,她是分配给以后使用,我猜!
猜你喜欢
  • 2018-04-23
  • 1970-01-01
  • 2022-12-06
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2013-06-30
相关资源
最近更新 更多