2012-01-11 21 views
7

Rails、MVC、CRUDの新機能です。更新メソッドを使用して投稿の投票数を変更しようとしています。 「3 /アップ/ /ポスト」にナビゲートした後ArgumentError:引数の数が間違っています(1の場合は2)

OpenMCJC::Application.routes.draw do 
    root :to => 'posts#index' 
    resources :posts 
    match '/posts/:id/:vote', :to => 'posts#update' 
end 

、:私は私の投稿コントローラー更新方法で次のコードを持っている:

def update 
    @post = Post.find(params[:id]) 

    if params[:vote] == 'up' 
     @post.update_column(:ups => @post[:ups] + 1) 
    elsif params[:vote] == 'down' 
     @post.update_column(:downs => @post[:downs] + 1) 
    end 

    flash[:notice] = "Thanks for voting! This helps us determine important issues in our schools." 

    redirect_to 'Posts#index' 
end 

をし、私は私のroutes.rbを、次のコードを持っていますそれは次のようなエラーがスローされます。ページによると

ArgumentError in PostsController#update 

wrong number of arguments (1 for 2) 

リクエストパラメータのような、次のとおりです。

{"id"=>"3", 
"vote"=>"up"} 

何が間違っているのか理解できますか?

答えて

14

update_columnには2つの引数があります。あなたは1つしか通過していません。

の代わりに:

@post.update_column(:ups => @post[:ups] + 1) 

試してみてください。

@post.update_column(:ups, @post[:ups] + 1) 

これは2つのの引数のように見えるかもしれません:

:ups => @post[:ups] + 1 

が、それは実際には1つのハッシュです。より一般的にupdate_attributes使用して

は、あなたはハッシュを渡すことができます:ミーシャが指摘したように

@post.update_attributes(:ups => @post[:ups] + 1) 
+0

これは以前私を噛まれています。悲しいことに。 – courtsimas

7

は、update_columnは2つの引数を取ります。しかし、私はあなたにこの方法の使用をお勧めしません。まず、必要でない可能性のある検証をスキップします。次に、Railsにはincrementing or decrementing valuesの組み込みメソッドがあります。あなたのケースでは、コントローラメソッドを次のように変更することができます:

if params[:vote] == 'up' 
    @post.increment(:ups) 
elsif params[:vote] == 'down' 
    @post.increment(:downs) 
end 
+0

ええ、彼はそれらの方法を使うべきです:+1 – Mischa

関連する問題