HAS_ONE属于关联属性验证



我将设计用于用户身份验证。有两个模型UserProfile,它们彼此相关联

  #app/model/user.rb
  class User < ApplicationRecord
    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable
    has_one :profile, dependent: :destroy
    enum role: [:admin, :seller, :buyer]
  end
 #app/model/profile.rb
  class Profile < ApplicationRecord
    belongs_to :user
  end

您可以看到,我也为用户角色。

这是两个模型的注册表格。

  #user registration form
  <%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    ...
    <%= f.select :role, collection: User.roles.keys.last(2) %>
    <%= f.input :mobile_number, required: true, autofocus: true  %>
    ...
  <% end %>
  #profile registration form 
  <%= simple_form_for(@profile) do |f| %>
    ...
    <% if current_user.seller? %>
      <%= f.input :location, required: true %>
    <% else %>
      <%= f.input :company_code, required: true %>
    <% end %>
    ...
  <% end %>

问题

当当前用户为seller时,我需要验证:location的存在,当用户为buyer时,则验证:company_code的存在。我该如何实现?感谢任何帮助,谢谢!

validates方法接受if选项:

# app/model/profile.rb
  class Profile < ApplicationRecord
    belongs_to :user    
    validates :location, presence: true, if: "user.seller?"
    validates :company_code, presence: true, if: "user.buyer?"
  end

另外,current_user.role == "seller"也已过时。Rails自动在枚举选项值的模型中自动设置其他方法,因此您可以写入:current_user.seller?等。

最新更新