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

时间:2015-10-05 09:04:13

标签: ruby-on-rails ruby-on-rails-4 devise friendly-id

我使用设计进行用户身份验证和注册。我可以注册用户没问题。我也在使用friendly。我的问题是,我只能创建一个用户个人资料。

设置......

user.rb:

<b>...</b>

profile.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

profiles_controller.rb:

class Profile < ActiveRecord::Base
 belongs_to :user
end

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

2 个答案:

答案 0 :(得分:4)

我们在部分应用中使用此设置 - User - &gt; 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

视图/表格如下:

#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

答案 1 :(得分:0)

不确定为什么不在用户的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