Rails 3 как использовать link_to для изменения значения логического в db?
Я пытаюсь создать простую ссылку, которая позволит администратору одобрить пользователя на моем веб-сайте.
довольно похоже на то, что пытался этот парень: В 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 в вашей модели с тем же именем, что и столбец, который пытается обновить = > удалить его
Ответы
Ответ 1
Вы можете обновить код ниже
Вы просматриваете
<% @users.each do |user| %>
<%= link_to 'Approve', active_user_path(user) %>
<% end %>
Контроллер
def activate
@user = User.find(params[:id])
if @user.update_attribute(:approved, true)
redirect_to "something"
else
render "something"
end
end
Ваши маршруты
match "users/:id/activate" => "users#activate", :as => "active_user"
Надежда может вам помочь.
Ответ 2
Похоже, вы не вызываете link_to правильно. Обратите внимание, что у вас есть действие как параметр http, а не часть URL.
URL должен быть
http://localhost:3000/users/123/activate
Посмотрите примеры на этой странице:
http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to
Я думаю, вам нужно использовать: controller = > 'users',: action = > 'activate'.
Помните, что вы также можете использовать строку для этого пути: "/users/${@user.id}/activate"
Ответ 3
Метод attr_accessor
создаст переменную экземпляра, а также геттер и сеттер для указанной переменной.
Когда вы пытаетесь обновить столбец базы данных с этим именем, вместо этого он использует переменную экземпляра. Это полезно, если вы хотите иметь "виртуальный столбец", который будет действовать как фактический столбец, но будет сохранен в памяти.
Для столбцов базы данных у вас есть attr_accessible
, который позволяет массовое присвоение этого столбца (это будет устаревать в rails 4), или вы не можете использовать метод для определения доступности столбцов и позволить ActiveRecord
справиться с ним.