2014-01-31 4 views
1

У меня есть пользовательское действие add_roles в контроллере и связанное представление формы с виртуальным атрибутом, называемым: role_name. Я хочу, чтобы проверить наличие: ROLE_NAME, но он не работает:проверить наличие виртуального атрибута

Это контроллер:

Class StaffsController < InheritedResources::Base 
    def roles 
    @staff=Staff.find params[:id] 
    end 

    def add_roles  
    @staff=Staff.find params[:id] 
    role_name=params[:staff][:role_name] #this field must be present 
    @staff.add_role Role.find(role_name).name 
    redirect_to staff_path(@staff) 
    end 
end 

Это модель:

class Staff < ActiveRecord::Base 
    attr_accessible :email, :name, :surname 
    attr_accessor :role_name 

    validates_presence_of :role_name 

    validate do |staff| 
    if staff.role_name.blank? 
     staff.errors[:base] << "INVALID" 
    end 
    end 
end 

Это мнение:

<%= simple_form_for @staff, url: :add_roles_staff do |f| %> 
    <%= f.input :role_name, as: :select, collection: Role.global %> 
    <%= f.button :submit %> 
<% end %> 

Правильное поведение, если я не выбираю окно выбора: role_name, форма показывает мне ошибку, но теперь это не работает. Форма не показывает мне никакой ошибки.

+0

Почему вы должны ROLE_NAME как в '' attr_accessible' и attr_accessor' ? Ошибка – usha

+0

. теперь я удаляю эту запись – user1066183

ответ

1

проверить нашу модель персонала, чтобы увидеть, если проверка работает, если запускается вручную:

s = Staff.new 
s.valid? 
s.role_name='role' 
s.valid? 

моя догадка это работает. если это так, ваша проверка никогда не срабатывала, возможно, потому, что вы не сохраняете модель (поскольку вы изменяете только виртуальный атрибут). поэтому я предполагаю, что это просто проверка правильности запуска.

Однако в вашем коде есть такой фундаментальный недостаток, что валидация, не работающая, по-видимому, является незначительной проблемой: вы должны явно установить связь между персоналом и его ролью в базе данных. В настоящий момент виртуальный атрибут не выдерживает жизненного цикла запроса/ответа. Как только вы перенаправите контроллер, это изменение навсегда потеряно.

НТН

и кстати validates_presence_of :role_name делает то, что вы ниже снова определить:

validate do |staff| 
    if staff.role_name.blank? 
    staff.errors[:base] << "INVALID" 
    end 
end 

так просто удалить этот код

Смежные вопросы