验证after_create上的状态

时间:2017-03-01 20:12:57

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个用户模型:

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

1 个答案:

答案 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