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

时间:2012-11-01 17:44:00

标签: ruby-on-rails model-view-controller methods routes hyperlink

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

与这个家伙的尝试非常相似:In Rails 3 how do I use button_to to change the value of a boolean?

以下是它的工作方式:

  1. 管理员点击链接以批准用户
  2. 该链接调用UsersController中的activate函数
  3. 活动函数调用用户建模
  4. 用户模型将已批准的属性更新为true并保存
  5. 以及我将如何做到这一点

    在我的用户#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"
    

    现在,当我点击链接(批准用户)时,我已经发回用户索引页面(就像我应该这样),但是用户字段&#34;已批准&#34;仍然设置为false:我

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

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

    有什么想法吗?

    更新

    如建议的那样,iv将链接添加到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&#39;

    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"
    

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

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

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

    我还尝试使用1表示true(以及update_attribute函数)和非字符串..这里的想法用完了lol

    解决方案

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

    tldr? 如果您的模型中的attr_accessor与您尝试更新的列名称相同=&gt;删除它

3 个答案:

答案 0 :(得分: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"
希望可以帮助你。

答案 1 :(得分:2)

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

网址应为

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

请查看此页面上的示例:

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

我认为你需要使用:controller =&gt; 'users',:action =&gt; '活化'。

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

答案 2 :(得分:0)

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

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

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