Rails 3如何使用link_to更改db中布尔值的值?
我正在尝试创建一个简单的链接,允许管理员批准我的网站上的用户
与这个家伙的尝试非常相似: 在Rails 3中如何使用button_to来改变布尔值?
这是它应该如何工作:
- 管理员单击链接以批准用户
- 该链接调用UsersController中的activate函数
- 活动函数调用用户建模
- 用户模型将已批准的属性更新为true并保存
这就是我要做的事情
在我的用户#index视图中
"index", :method => 'activate', :id => user.id, :class => 'btn btn-mini btn-danger' %>
在我的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"
现在当我点击链接(批准用户)时,我被发送回用户索引页面(就像我应该的那样),但用户字段“approved”仍然设置为false:I
点击链接后我得到的url:
http://localhost:3000/users?class=btn+btn-mini+btn-danger&id=2&method=activate
有任何想法吗?
UPDATE
建议iv将URL添加到link_to帮助程序
"users", :id => user.id, :action => "activate", :method => :put, :approved => true %>
当我点击帮助链接时,我得到了
wrong number of arguments (1 for 2)
在app / controllers / 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 [:user])
还有什么我应该放在那里?
哦,这是我的方法的路线
match "/users/:id/activate" => "users#activate"
UPDATE V2所以我已将更新行更改为:
@user.update_attributes(@user.approved, "true")
它似乎做了我想要它做的一切,除了将值更改为true!
我也尝试使用1作为true(和update_attribute函数)和非字符串..这里的想法用完了lol
解决方案
好吧这很尴尬,但碰巧在我的用户模型中我有attr_accessor :approved
这导致模型从未进入数据库更新:approved
列但是它更新了局部变量:approved
所以下次当我看当然,在列中:approved
值没有改变
tldr? 如果您的模型中的attr_accessor与您尝试更新的列名称相同=>将其删除
您可以更新以下代码
你查看
<% @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"
希望可以帮到你。
看起来你没有正确调用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"
attr_accessor
方法将创建一个实例变量以及所述变量的getter和setter。
当您尝试使用该名称更新数据库列时,它将使用实例变量。 如果您想要一个“虚拟列”,它将充当实际列但存储在内存中,这非常有用。
对于数据库列,您可以使用attr_accessible
来批量分配该列(这将在rails 4中弃用),或者您可以使用no方法来定义列的可访问性,并让ActiveRecord
处理它。