在Rails中更新单个属性

时间:2013-02-12 03:32:20

标签: ruby-on-rails

我想问一下如何直接更新rails中的单个属性。我已经尝试了很多方法来解决它,但它们都没有用。目前,在我看来,我有这行代码:

<%= link_to("Ban", admin_update_path(user), :confirm => "Are you sure?")%>

然后在我的控制器中:

def update 
       @user = User.first

        if @user.update_attributes(:reputation =>1)
            redirect_to admin_viewAllUsers_path, :notice => "User banned!"
        else
            render "index"
        end  

    end

然后在我的路线中:

get "admin/edit"
put "admin/update"

注意: 如果我在我的路由中使用“admin / update”,我会得到“No route matches [GET]”/admin/update.2“错误,但是当我使用”admin / update“时我没有收到任何错误但我的:声誉不会更新。顺便说一句,:声誉是一个整数

此外,如果我使用User.find(params [:id])而不是User.first,我将得到“找不到没有ID的用户”错误。

请帮助。我该怎么办?我哪里出错了?

3 个答案:

答案 0 :(得分:2)

对于单个属性,您可以使用:

@user.update_attribute(:reputation,1)

对于我的意见更新行动,它是不同的(更改名称,姓氏等)不仅禁止,我认为你应该创建行动ban

    def ban 
      @user = User.find(params[:id])
      @user.update_attribute(:reputation,1)
      redirect_to admin_viewAllUsers_path, :notice => "User banned!"
    end

及其路线:

match 'admin/users/:id/ban', :to => 'users#ban', :as => 'admin_user_ban', :via => :post

最后链接:

<%= link_to("Ban", admin_user_ban_path(user), :confirm => "Are you sure?", :method => :post)%>

答案 1 :(得分:0)

为什么不

@user.reputation = 1
if @user.save
  #do something
else
  puts "Did not save"
end

是您的accessible_attributes中的声誉吗?

答案 2 :(得分:0)

您的路线期待PUT方法。这些方面的东西......

<%= link_to("Ban", admin_path(user), :confirm => "Are you sure?", :method => :put)%>

您在路线文件中的编辑和放置方法不表示:id属性。在你的情况下,像这样:

get "admin/:id/edit"
put "admin/:id"