我使用设计进行用户身份验证和注册。我可以注册用户没问题。我也在使用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
为什么只有一个用户可以创建个人资料而不是其他用户?这与关系有关吗?
答案 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