ArgumentError: неверное количество аргументов (1 для 2) - PullRequest
9 голосов
/ 11 января 2012

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

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

, и у меня есть следующий код в моем rout.rb:

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

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

ArgumentError in PostsController#update

wrong number of arguments (1 for 2)

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

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

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

Ответы [ 2 ]

19 голосов
/ 11 января 2012

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

Вместо:

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

Попробуйте:

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

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

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

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

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

@post.update_attributes(:ups => @post[:ups] + 1)
9 голосов
/ 11 января 2012

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

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