11

我正在尝试创建一个简单的链接,允许管理员在我的网站上批准用户

与这个人尝试的非常相似:在 Rails 3 中,我如何使用 button_to 来更改布尔值?

这是它应该如何工作的:

  1. 管理员单击链接以批准用户
  2. 链接调用UsersController中的activate函数
  3. 用户建模的活动函数调用
  4. 用户模型将approved属性更新为true并保存

这就是我要怎么做

在我的用户#index 视图中

 <% @users.each do |user| %> 
 <%= link_to 'Approve', :action => "index", :method => 'activate', :id => user.id, :class => 'btn btn-mini btn-danger' %> 
<% end %> 

在我的用户控制器中

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

点击链接后我得到的网址:

  http://localhost:3000/users?class=btn+btn-mini+btn-danger&id=2&method=activate

有任何想法吗?

更新

正如建议的那样,iv 将 URL 添加到了 link_to 助手

<% @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) 

在 app/controllers/users_controller.rb:7:in `activate'

def activate
  @user = User.find(params[:id])
  @user.update_attribute(params[:user])
  redirect_to "/users?approved=false"
end

第 7 行,错误为 @user.update_attribute(params[:user])

我还应该放什么?

哦,这是我使用这种方法的路线

match "/users/:id/activate" => "users#activate"

UPDATE V2 所以我已将该更新行更改为:

@user.update_attributes(@user.approved, "true")

它似乎做了我想做的所有事情,除了将值更改为 true !

我还尝试将 1 用于 true (以及 update_attribute 函数)和非字符串 .. 在这里没有想法了哈哈

解决方案

好吧,这很尴尬,但是碰巧在我的用户模型attr_accessor :approved 中,这导致该模型从未进入数据库来更新:approved列,而是更新了局部变量:approved,因此下次当我查看该列时,当然是:approved价值没有改变

tldr?如果您的模型中有 attr_accessor 与您尝试更新的列同名 => 删除它

4

3 回答 3

8

您可以更新下面的代码

你查看

<% @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"

希望能帮到你。

于 2012-11-03T13:44:03.457 回答
2

看起来您没有正确调用 link_to 。请注意,您将操作作为 http 参数,而不是 URL 的一部分。

网址应该是

http://localhost:3000/users/123/activate

查看此页面上的示例:

http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to

我认为您需要使用:controller => 'users',:action => 'activate'。

请记住,您也可以在此处使用字符串作为路径:"/users/${@user.id}/activate"

于 2012-11-01T17:57:52.570 回答
0

attr_accessor方法将创建一个实例变量以及该变量的 getter 和 setter。

当您尝试使用该名称更新数据库列时,它会改用实例变量。如果您想要一个“虚拟列”,这将很有用,它将充当实际列但存储在内存中。

对于您拥有attr_accessible的允许对该列进行批量分配的数据库列(这将在 rails 4 中被弃用),或者您可以不使用任何方法来定义列的可访问性并让其ActiveRecord处理。

于 2013-03-30T05:51:37.190 回答