【问题标题】:undefined method `id' for nil:NilClass (Devise - Rails 5)nil:NilClass 的未定义方法“id”(设计 - Rails 5)
【发布时间】:2017-10-06 13:52:12
【问题描述】:

我正在尝试在用户(设计)之间建立关系(关注/取消关注)功能。但是在我的用户/索引上,我得到了 nil:NilClass 错误的未定义方法“id”,这是我的文件:

users.controller.rb

    class UsersController < ApplicationController
    before_action :authenticate_user!
    before_action :set_user, only:[:show, :index]

    def index
        @users = User.where.not(id: current_user.id)
    end

    def show
    end

    private

    def set_user
        @user = User.find_by(username: params[:id])
    end

    def user_params
        params.require(:user).permit(:name, :username, :description, :location, :user_id)
    end
end

_user.html.erb

<div class="row">
        <% @users.each do |user| %>
            <div class="col-3">
                <div class="card user text-center">
                  <div class="card-body">
                    <%= link_to user_path(user.name) do %>
                        <%= image_tag(user.user_avatar_url, class: 'rounded', width: '64') %>
                    <% end %>
                    <br>
                    <br>
                    <h5 class="card-title">
                        <%= link_to user_path(user.name) do %>
                        <small>@<%= user.username %></small><br>
                        <% end %>
                        <%= user.name %>
                    </h5>
                    <p>
                        <%= user.description.first(50) %>...
                    </p>
                    <p>
                        <i class="fa fa-map-marker" aria-hidden="true"></i> <%= user.location %>
                    </p>

                    <p>
                        <%= render 'shared/follow_button' %>
                    </p>
                  </div>
                </div>
            </div>
        <% end %> 
    </div>

用户.rb

class User < ApplicationRecord

mount_uploader :user_avatar, UserAvatarUploader
mount_uploader :user_cover, UserCoverUploader

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

         has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy
         has_many :passive_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy

         has_many :following, through: :active_relationships, source: :followed
         has_many :followers, through: :passive_relationships, source: :follower

         #helper methods

         #follow another user
         def follow(other)
            active_relationships.create(followed_id: other.id)
         end

         #unfollow a user
         def unfollow(other)
            active_relationships.find_by(followed_id: other.id).destroy
         end

         #is following a user?
         def following?(other)
            following.include?(other)
         end

end

这是我用作关注和取消关注按钮的部分内容,这是浏览器中显示错误的地方。

_following_button.html.erb

<% if current_user.id != @user.id %>
    <% if !current_user.following?(@user) %>
        <%= form_for(current_user.active_relationships.build) do |f| %>
            <div><%= hidden_field_tag :followed_id, @user.id %></div>
            <%= f.submit "Connect", class: "btn btn-dark" %>
        <% end %>
    <% else %>
        <%= form_for(current_user.active_relationships.find_by(followed_id: @user.id), html: { method: :delete}) do |f| %>
            <%= f.submit "Disconnect", class: "btn btn-light" %>
        <% end %>
    <% end %>
<% end %>

【问题讨论】:

  • 使用binding.prybyebug 找出哪个变量意外地是nil,然后找出原因。
  • 谢谢@meagar 我会试一试的。 @sawa 我想为 nil:NilClass 错误修复未定义的方法 `id'。

标签: ruby-on-rails devise ruby-on-rails-5


【解决方案1】:

这是您的部分文件中的错误&lt;%= render 'shared/follow_button' %&gt;

<% if current_user.id != user.id %>
    <% if !current_user.following?(user) %>
        <%= form_for(current_user.active_relationships.build) do |f| %>
            <div><%= hidden_field_tag :followed_id, user.id %></div>
            <%= f.submit "Connect", class: "btn btn-dark" %>
        <% end %>
    <% else %>
        <%= form_for(current_user.active_relationships.find_by(followed_id: user.id), html: { method: :delete}) do |f| %>
            <%= f.submit "Disconnect", class: "btn btn-light" %>
        <% end %>
    <% end %>
<% end %>

应该是 user 而不是 @user,因为它是从您的部分 _user.html.erb 发送的

【讨论】:

  • 我也建议你用你的部分文件发送 locals 参数,像这样
  • 我得到了 #:0x007fea1d476080> 的未定义局部变量或方法 `user' 你是说吗? @user @users
  • 在 locals 变量中使用这个而不是 send 参数
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 2018-04-23
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多