2012-01-11 3 views
7

Я очень новичок в Rails, MVC и CRUD, и я пытаюсь использовать метод обновления, чтобы изменить количество голосов на сообщение. У меня есть следующий код в моем методе обновления сообщений контроллера:ArgumentError: неправильное количество аргументов (1 для 2)

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:

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

После перехода в «/ сообщений/3/вверх», он выдает следующее сообщение об ошибке:

ArgumentError in PostsController#update 

wrong number of arguments (1 for 2) 

параметры запроса в соответствии со страницы, такие, как, например:

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

Можете ли вы помочь мне выяснить, что пошло не так?

ответ

14

update_column принимает два аргумента. Вы только проходите мимо.

Вместо:

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

Try:

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

Это может показаться два аргументы:

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

, но на самом деле это один хэш.

С более широко используется update_attributes, вы можете передать хэш:

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

Это уже укусило меня. К сожалению. – courtsimas

7

Как Миша отметил, update_column принимает два аргумента. Однако я бы отговорил вас от использования этого метода. Во-первых, он пропускает проверки, которые могут быть не такими, какие вы хотите. Во-вторых, Rails имеет встроенные методы для incrementing or decrementing values. В вашем случае вы можете изменить свой метод контроллера на что-то вроде этого:

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

Да, он должен использовать эти методы: +1 – Mischa

Смежные вопросы