我使用devise进行用户身份验证。有两个模型User
和Profile
相互关联,如此
#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
。
我怎样才能做到这一点?我感谢任何帮助,谢谢!
答案 0 :(得分:3)
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?
等。