Я пытаюсь создать простую ссылку, которая позволит администратору одобрить пользователя на моем веб-сайте.
довольно похоже на то, что пытался этот парень: В Rails 3 как я могу использовать button_to для изменения значения логического?
Вот как это должно было работать:
- Администратор нажимает на ссылку, чтобы одобрить пользователя.
- Ссылка вызывает функцию активации в UserController
- Активная функция вызывает модель пользователей
- модель пользователя обновляет утвержденный атрибут до true и сохраняет его
и вот как я собирался это сделать
в моих пользователях # индексный вид
<% @users.each do |user| %>
<%= link_to 'Approve', :action => "index", :method => 'activate', :id => user.id, :class => 'btn btn-mini btn-danger' %>
<% end %>
в моем userController
def activate
@user = User.find(params[:user])
@user.activate_user
end
в моей модели пользователя
def activate_user
self.approved = 'true'
self.save
end
и мои маршруты
devise_for :users, :controllers => { :registrations => "registrations" }
resources :users do
member do
get 'activate'
put 'activate'
end
end
match "users/:id/activate" => "users#activate"
Теперь, когда я нажимаю ссылку (чтобы утверждать пользователей), я возвращаюсь на страницу индекса пользователя (например, я должен), но поле пользователя "одобрено" по-прежнему установлено в false: I
URL, который я получаю после нажатия ссылки:
http://localhost:3000/users?class=btn+btn-mini+btn-danger&id=2&method=activate
Любые идеи?
UPDATE
Как было предложено iv, добавьте URL-адрес в link_to helper
<% @users.each do |user| %>
<%= link_to "Approve", :controller => "users", :id => user.id, :action => "activate", :method => :put, :approved => true %>
<% end %>
Когда я нажимаю ссылку помощника, я получаю
wrong number of arguments (1 for 2)
в приложении/контроллерах/users_controller.rb: 7: в `activate '
def activate
@user = User.find(params[:id])
@user.update_attribute(params[:user])
redirect_to "/users?approved=false"
end
строка 7, где ошибка @User.update_attribute (PARAMS [: пользователя])
Что еще я должен там положить?
oh и вот мой маршрут для этого метода
match "/users/:id/activate" => "users#activate"
ОБНОВЛЕНИЕ V2 Поэтому я изменил эту строку обновления на:
@user.update_attributes(@user.approved, "true")
и он, кажется, делает все, что я хочу, чтобы сделать, кроме изменения значения в true!
Я также попытался использовать 1 для true (и функцию update_attribute) и non-strings.. исчерпывает идеи здесь lol
Решение
Ну, это неудобно, но так бывает, что в моей модели пользователя у меня было attr_accessor :approved
, это привело к тому, что модель никогда не попадала в базу данных для обновления столбца :approved
BUT вместо этого обновляла локальную переменную :approved
так в следующий раз, когда я посмотрел на столбец, то, конечно, значение :approved
не изменилось
TL;DR? если у вас есть attr_accessor в вашей модели с тем же именем, что и столбец, который пытается обновить = > удалить его