我在使用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服务器。我不知道我错过了什么,但我肯定会欣赏一双新鲜的眼睛。我认为这必须与我如何建立模型有关。
答案 0 :(得分:1)
模型看起来很好,但是在index
上的UsersController
方法中,您有以下行:@users = User.all
。这会创建一个用户数组,这意味着您无法在其上调用.friends
。您需要通过迭代单独访问每个用户
@users.each do |user|
user.friends
# ... more code
end
或其他一些手段。