【发布时间】:2012-10-22 08:52:59
【问题描述】:
我正在尝试创建一个简单的链接,允许管理员在我的网站上批准用户
与这个人的尝试非常相似:In Rails 3 how do I use button_to to change the value of a boolean?
它应该是这样工作的:
- 管理员单击链接以批准用户
- 链接调用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"
更新 V2 所以我已将该更新行更改为:
@user.update_attributes(@user.approved, "true")
它似乎做了我想做的所有事情,除了将值更改为 true !
我也尝试将 1 用于 true(以及 update_attribute 函数)和非字符串。。这里的想法用完了,哈哈
解决方案
这很尴尬,但碰巧在我的用户模型中我有attr_accessor :approved 这导致模型从未进入数据库更新:approved 列但它更新了局部变量:approved 所以下次当我查看该列时,:approved 的值当然没有改变
tldr? 如果您的模型中有 attr_accessor 与您尝试更新的列同名 => 删除它
【问题讨论】:
-
link_to的第二个参数应该是一个url,然后你输入你的选项。试试
link_to "Approve", users_path, #... -
Tru 运行 rake 路由并查看哪条路由实际指向
users#activate。使用辅助变量。
标签: ruby-on-rails model-view-controller methods routes hyperlink