只能创建一个用户配置文件 - Rails 4.2.4

Can only create one user profile - Rails 4.2.4

我正在使用 devise 进行用户身份验证和注册。我可以注册一个用户没问题。我也在使用 friendly。我的问题是,我只能创建一个用户配置文件。

设置...

user.rb:

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged
  validates :name, uniqueness: true, presence: true
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
 has_one :profile # each user should have just one profile
end

profile.rb:

class Profile < ActiveRecord::Base
 belongs_to :user
end

profiles_controller.rb:

class ProfilesController < ApplicationController
  before_action :authenticate_user!
  before_action :only_current_user

  def new
    # form where a user can fill out their OWN profile
    @user = User.friendly.find( params[:user_id] )
    @profile = Profile.new
  end

  def create
    @user = User.friendly.find( params[:user_id] )
    @profile = @user.build_profile(profile_params)
    if @profile.save # Not saving!!
      flash[:success] = 'Profile Created!'
      redirect_to user_path( params[:user_id] )
    else
      render action: :new # keeps rendering!
    end
  end

  private
    def profile_params
        params.require(:profile).permit(:first_name, :last_name, :avatar,       :job_title, :phone_number, :business_name)
    end
end

为什么只有一个用户可以创建个人资料,而其他用户不能?跟关系有关系吗?

不确定为什么不在用户的 after_create 事件中创建配置文件。一旦创建了用户 - 创建一个空的(但关联的)配置文件。

class User  
  has_one :profile, dependent: :destroy
  after_create {
    build_profile unless profile
    profile.save
  }
end

class Profile
  belongs_to :user, autosave: true
end

那么,在你的控制器中你只需要更新方法。

def update
  if current_user.profile.update_attributes(user_params)
    flash_it :success
    return redirect_to edit_user_profile_path
  else
    flash_it :error
    render :edit
  end
end

我们在一些应用程序中使用此设置 - User -> Profile

简而言之,您应该在创建用户时构建配置文件。然后您可以根据需要编辑 配置文件。您使用 Profile.new 方法的问题非常低效...


#app/models/user.rb
class User < ActiveRecord::Base
   has_one :profile 
   before_create :build_profile #-> saves blank associated "Profile" object after user create
end

这意味着每次 创建 User,它们对应的 Profile 对象也会附加到数据库中。

这将使您能够根据需要编辑配置文件:

#config/routes.rb
resources :users, path_names: { edit: "profile", update: "profile" }, only: [:show, :edit, :update]

这将使您有机会使用以下内容:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   before_action :authenticate_user!, only: [:edit, :update]
   before_action :authorize, only: [:edit, :update]

   def show
      @user = User.find params[:id]
   end

   def edit
      @user = current_user
   end

   def update
      @user = current_user
      @user.update user_params
   end

   private

   def authorize
      id = params[:id]
      redirect_to user_show_path(id) if current_user.id != id #-> authorization
   end

   def user_params
      params.require(:user).permit(:x, :y, :z, profile_attributes: [:homepage, :other, :profile, :attributes])
   end
end

view/form 如下:

#app/views/users/edit.html.erb
<%= form_for @user do |f| %>
   <%= f.fields_for :profile do |f| %>
       <%= f.text_field :homepage %>
       ...
   <% end %>
   <%= f.submit %>
<% end %>

关于您的当前设置:

def new
    @profile = current_user.profile.new
end

def create
    @profile = current_user.profile.new profile_params
    if @profile.save
      redirect_to user_path(params[:id]), notice: "Profile Created!"
    else
      render action: :new 
    end
end

private

def profile_params 
   params.require(:profile).permit(:x, :y, :z)
end