2012-01-11 19 views
7

Jestem bardzo nowy w Railsach, MVC i CRUD i próbuję użyć metody aktualizacji, aby zmienić liczbę głosów w poście. Mam następujący kod w moim metoda aktualizacji Posty Kontroler:ArgumentError: niepoprawna liczba argumentów (1 na 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 

i mam następujący kod w mojej routes.rb:

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

Po przechodząc na "/ posty/3/up", rzuca się następujący błąd:

ArgumentError in PostsController#update 

wrong number of arguments (1 for 2) 

parametrów żądania według strony są takie:

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

Czy możesz mi pomóc dowiedzieć się, co poszło nie tak?

Odpowiedz

14

update_column przyjmuje dwa argumenty. Tylko je mijasz.

Zamiast:

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

Spróbuj:

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

To może wydawać się dwa argumentów:

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

ale to faktycznie jeden hash.

z bardziej powszechnie stosowane update_attributes, można przekazać hash:

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

To mnie wcześniej ugryzło. Niestety. – courtsimas

7

Jak Mischa wskazał, update_column przyjmuje dwa argumenty. Jednak zniechęciłbym cię do korzystania z tej metody. Po pierwsze pomija sprawdzanie poprawności, które może nie być tym, czego potrzebujesz. Po drugie, Rails ma wbudowane metody dla incrementing or decrementing values. W twoim przypadku możesz zmienić metodę kontrolera na coś podobnego:

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

Tak, powinien użyć tych metod: +1 – Mischa

Powiązane problemy