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 справиться с ним.