Ruby on Rails - 无法为每个用户创建新的配置文件

时间:2016-03-30 13:57:07

标签: ruby-on-rails ruby devise

我正在与每个拥有个人资料的用户构建一个活动应用。我为该网站设置了一些用户,但是当我尝试为每个用户创建和/或编辑个人资料时,它会将我引回到一条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

任何帮助都将不胜感激。

3 个答案:

答案 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 

好运。