Rails自联接会产生错误

时间:2014-03-26 06:15:26

标签: ruby-on-rails ruby-on-rails-4

我在使用Rails 4中的友情模型时遇到了麻烦。我设置了一个友谊控制器并修改了我的用户模型以使用自连接,如下所示。

友谊模特:

class Friendship < ActiveRecord::Base

    belongs_to :user
    belongs_to :friend, class_name: "User", foreign_key: "friend_id"

    validates_presence_of :user_id, :friend_id
end

用户模型:

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

         has_many :items
         has_many :friendships
end

我的UserController:

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  before_filter :authenticate_user!
  load_and_authorize_resource

  def index
    authorize! :index, @user, message: 'Not authorized as an administrator.'
    @users = User.all
  end

  def update
    authorize! :update, @user, message: 'Not authorized as an administrator.'
    if @user.update_attributes(params[:user])
      redirect_to users_path, notice: "User updated."
    else
      redirect_to users_path, alert: "Unable to update user."
    end
  end

  def destroy
    authorize! :destroy, @user, message: 'Not authorized as an administrator.'
    user = User.find(params[:id])
    unless user == current_user
      user.destroy
      redirect_to users_path, notice: "User deleted."
    else
      redirect_to users_path, notice: "Can't delete yourself."
    end
  end

  private

# Use callbacks to share common setup or constraints between actions.
def set_user
  @user = User.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params.require(:user).permit( :name, :email, :role_ids, :id, :user_id )
end


end

我的日志的相关部分:

NoMethodError - 未定义的方法friends' for nil:NilClass: app/views/users/index.html.erb:32:in _ app_views_users_index_html_erb__2019584293611114470_70229529361660'

除非我完全错过了这个,否则我应该能够以@ users.friends的身份访问朋友,但这会给我一个NoMethod错误。我也试过以@ users.friendships的身份访问它,但我得到了同样的错误。

我已经运行了迁移并重新启动了我的rails服务器。我不知道我错过了什么,但我肯定会欣赏一双新鲜的眼睛。我认为这必须与我如何建立模型有关。

1 个答案:

答案 0 :(得分:1)

模型看起来很好,但是在index上的UsersController方法中,您有以下行:@users = User.all。这会创建一个用户数组,这意味着您无法在其上调用.friends。您需要通过迭代单独访问每个用户

@users.each do |user|
  user.friends
  # ... more code
end

或其他一些手段。