问题 Rails 3如何使用link_to更改d​​b中布尔值的值?


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

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

这是它应该如何工作:

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

这就是我要做的事情

在我的用户#index视图中

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

现在当我点击链接(批准用户)时,我被发送回用户索引页面(就像我应该的那样),但用户字段“approved”仍然设置为false:I

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

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

有任何想法吗?

UPDATE

建议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:在`activate'中

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

第7行出错的地方     @ user.update_attribute(PARAMS [:用户])

还有什么我应该放在那里?

哦,这是我的方法的路线

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

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

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

它似乎做了我想要它做的一切,除了将值更改为true!

我也尝试使用1作为true(和update_attribute函数)和非字符串..这里的想法用完了lol

解决方案

嗯这很尴尬,但所以它发生在我的用户模型中 attr_accessor :approved  这导致模型从未进入数据库更新 :approved 列BUT而是更新了局部变量 :approved 所以下次当我查看专栏时,当然是 :approved 价值没有改变

tldr? 如果您的模型中的attr_accessor与您尝试更新的列名称相同=>将其删除


3504
2017-11-01 17:44


起源

link_to的第二个参数应该是一个url,然后你输入你的选项。尝试 link_to "Approve", users_path, #... - Ian Armit
Tru运行rake路线并查看实际指向的路线 users#activate。使用辅助变量。 - nicooga


答案:


您可以更新以下代码

你查看

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

希望可以帮到你。


8
2017-11-03 13:44



我做了你建议的改变,但我仍然得到这个错误 wrong number of arguments (1 for 2)  这条线 @user.update_attribute(approved: true) - Matti
Okey这是非常奇怪的:它可以改变 :email 但不是 :approved 属性,使用sqlite是否重要?它似乎更喜欢't'而不是true(但数值仍然在db中改变) - Matti
看起来像Rails和Sqlite在boolians方面不能很好地沟通!我需要某种适配器,但你已经解决了我的旧问题谢谢! :) - Matti
@Matti update_attribute method接受两个参数,而不是一个。您正在传递哈希,这是一个参数。看 这里 有关此更详细的解释。 - Matt
它应该是 update_attribute(:approved, true) - Lluís


看起来你没有正确调用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"


2
2017-11-01 17:57



非常感谢您的链接!在阅读API后,我不确定link_to是否是正确的方法。我想要的是一个按钮,调用usercontroller中的“激活”功能,使得批准的属性为true,然后只返回用户索引,我应该使用link_to吗? - Matti
也许按钮标签会更好。看到 stackoverflow.com/questions/2254720/... - RonanOD
我想我可以让link_to工作,你在哪里找到了丢失的网址,但它引发了我一个新的错误,请看我更新的帖子:) - Matti


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

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

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


0
2018-03-30 05:51