我有一个用户模型:
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :profile, dependent: :destroy
after_create :build_profile
end
因此,当用户注册时,会创建配置文件并将其重定向到edit_profile_page
class RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(resource)
edit_profile_path(current_user)
end
end
在我的个人资料模型中,我试图设置一些验证
class Profile < ApplicationRecord
belongs_to :user
...
validates :name, presence: true
end
我也使用了friendly_id gem
profile_controller.rb
def set_profile
@profile = Profile.friendly.find(params[:id])
end
我收到的错误是我注册新用户的时间是:
Couldn't find Profile with 'id'=6
只有在我尝试应用validates :name, presence: true
时才会发生这种情况,如果没有这个,我的应用程序运行正常。在创建配置文件模型之后,我需要一种在用户注册后验证名称的方法。
我也在这一行得到错误:
def set_profile
@profile = Profile.friendly.find(params[:id])
end
答案 0 :(得分:1)
build_profile
中的{p> after_create
会构建一个配置文件,但它不会持久化。它不是在数据库中创建的。
更好的可能是......
def after_sign_up_path_for(resource)
new_profile_path
end
在您的控制器中
def new
@profile = current_user.build_profile
...
end
def create
@profile = current_user.build_profile
if @profile.update_attributes(profile_params)
...
end
...
end