我正在尝试创建一个简单的链接,允许管理员在我的网站上批准用户
与这个人尝试的非常相似:在 Rails 3 中,我如何使用 button_to 来更改布尔值?
这是它应该如何工作的:
- 管理员单击链接以批准用户
- 链接调用UsersController中的activate函数
- 用户建模的活动函数调用
- 用户模型将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 与您尝试更新的列同名 => 删除它