只能创建一个用户配置文件 - 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
我正在使用 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