2017-02-22 106 views
2

Я использую устройство для аутентификации пользователей. Есть две модели User и Profile, которые связаны друг с другом, как этотhas_one принадлежит_автоматизация атрибута атрибута

#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

Является ли 'location' атрибутом в таблице профиля? –

+0

@Ahmadhamza nope свой атрибут таблицы профилей –

ответ

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 автоматически устанавливает дополнительные методы в модели для значений параметра enum, поэтому вы можете просто написать: current_user.seller? и т. Д.

+0

Отлично, спасибо огромное! –

+0

@ arm2pro приветствуется. Если мой ответ решает вашу проблему, пожалуйста, не забудьте пометить ее как принятую –