我正在与每个拥有个人资料的用户构建一个活动应用。我为该网站设置了一些用户,但是当我尝试为每个用户创建和/或编辑个人资料时,它会将我引回到一条Flash消息"该个人资料不属于您!"这是参考我的第一个用户配置文件,它已设置并正常工作。
我使用Devise gem进行初始设置,但是已经使用我自己的用户控制器进行了构建。这是来自该控制器的代码 -
class UsersController < ApplicationController
before_action :authenticate_user!
before_action :set_user
before_action :owned_profile, only: [:edit, :update]
def new
@user = User.new
end
def show
@user = User.find(params[:id])
end
def create
end
def edit
@user = current_user #User.find_by(params[:id])
end
def update
@user = User.find_by(params[:id])
if @user.update(user_params)
redirect_to user_path, notice: "Profile successfully updated!"
else
render 'edit'
end
end
private
def user_params
params.require(:user).
permit(:name, :username, :biography, :email, :url)
end
def owned_profile
unless current_user == @user
flash[:alert] = "That profile doesn't belong to you!"
redirect_to root_path
end
end
def set_user
@user = User.find_by(params[:id])
end
end
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果问题是Users
无法编辑自己的个人资料,那么我认为这是由于在set_user中使用find_by
造成的:
@user = User.find_by(params[:id])
应该是:
@user = User.find(params[:id])
如果你真的想使用find_by,你可以这样做:
@user = User.find_by_id(params[:id])
或者
@user = User.find_by(id: params[:id])
用作上述2个示例的 Find_by
如果找不到User
,则不会引发错误,而find
则会错误。
旁注:您可以在show动作中删除@user分配。
答案 1 :(得分:0)
我会创建一个管理员。一种简单的方法是在users表中添加一个名为admin的列,并使其成为布尔值。迁移数据库。
然后在运行owned_profile方法之前检查用户是否是管理员。在该方法中,将unless current_user == @user
更改为
unless current_user == @user || current_user.admin
然后在控制台中将自己设置为管理员,保存然后自由添加配置文件,而不运行该回调。
答案 2 :(得分:0)
你可以这样做。
用户注册时,会自动创建个人资料。这个ID
用户和个人资料表的优点是相同的。
rails g model profile first_name last_name email
rails g migration add_user_id_to_profiles user_id:integer
Profile.rb
belongs_to :user
User.rb
has_one :profile, dependent: :destroy
before_create :set_profile
def set_profile
build_profile(id: self.id, user_id: self.id, email: self.email)
end
好运。