2013-02-22 3 views
1

Я пытаюсь создать пользовательскую форму, которая позволяет администраторам включать и отключать пользовательские привилегии пользователей и сохранять их в базе данных. Я должен делать что-то совершенно неправильное, потому что страницы генерируются отлично, а кнопка отправки подчиняется прекращению действия, но ничего не сохраняется в базе данных, и она просто возвращает мое первоначальное представление снова. Может ли кто-нибудь увидеть, что я делаю неправильно?Как правильно создать настраиваемое действие в Rails?

Кодекс

Маршруты:

resources :users do 
    member do 
    get 'assign' 
    put 'assign_update' 
    end 
end 
... 

Controller (Этот странный способ делать это попытка обойти тот факт, что администратор и другие атрибуты не доступны Это может быть беспорядок..):

... 
def assign 
    @user = User.find(params[:id]) 
end 

def assign_update 
    admin_protected = params[:user].delete(:admin) 

    @user = User.find(params[:id]) 
    @user.admin = admin_protected 

    if @user.save 
    flash[:success] = "User updated" 
    redirect_to users_path 
    else 
    render 'assign' 
    end 
end 

Вид:

... 
<%= form_for(@user, url: { controller: 'users', 
    action: 'assign_update'}, method: 'put') do |f| %> 
    <%= f.label :admin, 'Is admin?', class: 'checkbox inline' %> 
    <%= f.check_box :admin %> 
    <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
<% end %> 
+0

Когда вы говорите, что «это просто возвращает мой первоначальный вид снова», вы имеете в виду, что он отображает представление назначения? –

+0

Он показывает содержимое представления назначения yes, которое я предполагаю, является результатом 'render 'assign'', потому что он не сохраняет. URL-адрес изменится на assign_update, и если я сниму флажок, он останется непроверенным, но при проверке базы данных через консоль атрибут admin не изменится. –

+0

Хорошо. Это может быть не напрямую связано с проблемой, но 'admin_protected = params [: user] .delete (: admin)' кажется подозрительным. Не будет ли эта строка всегда удалять атрибут 'admin' из пользовательского параметра? –

ответ

1

Итак, подведем итог разговора мы имели в комментариях под вопрос ...

Проблема была признана проверкой на другие атрибуты пользовательской модели. Экземпляр пользователя не мог быть сохранен, потому что проверки не проходили при выполнении метода save. В результате Rails просто отобразил присваивание вида.

update_attribute метод обновляет атрибут без проверки модели или защиты массового присвоения. А атрибут admin соответствует этим двум критериям в этом случае.

0

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

Так

def assign_update 
    admin_protected = params[:user].delete(:admin) 

    @user = User.find(params[:id]) 
    @user.admin = admin_protected 

    if @user.save 
    flash[:success] = "User updated" 
    redirect_to users_path 
    else 
    render 'assign' 
    end 
end 

становится

def assign_update 
#  admin_protected = params[:user].delete(:admin) 

     @user = User.find(params[:id]) 
     @user.admin = params[:user][:admin] 

     if @user.save 
     flash[:success] = "User updated" 
     redirect_to users_path 
     else 
     render 'assign' 
     end 
    end 

проблема заключается в том, что в своем подходе вы еще масса присвоившей.

Для отладки, что на самом деле происходит, вы должны внимательно посмотреть на входе выходной файл

UPDATE

Проверьте список ошибок. Добавьте следующие строки в форме

<% if @user.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@user.errors.count, "error") %> prohibited this account from being saved:</h2> 

     <ul> 
     <% @user.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

Это должно дать вам, объявление своим пользователям более четкое представление о том, что не так и как это исправить

+1

Это интересное наблюдение. Если проблема связана с массовым назначением атрибута admin, не должно ли Rails генерировать исключение массового присваивания, а не переопределение присвоения? –

+0

Я использую 'attr_accessible' в моей модели, а администратора нет в списке. Насколько я понимаю, ваше изменение кода не очень сильно меняет его функциональность. Вы по-прежнему вручную устанавливаете переменную, а не используете 'update_attributes', что и делает мой код. Все, что вы сделали, - это перемещение значения, которое я присваиваю '@ user.admin' из переменной' admin_protected'. –

+0

Я должен добавить, что так же, как проверка работоспособности, я попробовал это, и он функционирует одинаково. :) –

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