2013-05-03 22 views
8

używam opracować (2.2.3) i staram się załadować „edytuj” formularz dla użytkownika za pomocą tego jQuery ajax połączenia:Rails 3.2.13/Devise 2.2.3: Metoda "authenticate_scope!" wyrzuca błąd: nieprawidłowa liczba argumentów (1 0)

$.ajax({ 
    type: 'GET', 
    url: '/users/edit', 
    data: { 
    id: id 
    } 
}); 

Będzie nazywamy to before_filter ...

prepend_before_filter :authenticate_scope!, :only => [:edit, :update, :destroy] 

... z pliku gem ...

devise/app/controllers/devise/registrations_controller.rb 

(see: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb) 

Sposób, który jest w końcu nazywa się:

# Authenticates the current scope and gets the current resource from the session. 
def authenticate_scope! 
    send(:"authenticate_#{resource_name}!"), :force => true) 
    self.resource = send(:"current_#{resource_name}") 
end 

a błąd pojawia się:

ArgumentError at /users/edit 
============================ 

> wrong number of arguments (1 for 0) 

(gem) devise-2.2.3/app/controllers/devise/registrations_controller.rb, line 116 
------------------------------------------------------------------------------- 

``` ruby 
    111  signed_in_root_path(resource) 
    112  end 
    113 
    114  # Authenticates the current scope and gets the current resource from the session. 
    115  def authenticate_scope! 
> 116  send(:"authenticate_#{resource_name}!", :force => true) 
    117  self.resource = send(:"current_#{resource_name}") 
    118  end 
    119 end 
``` 

Ale kiedy usunąć ": siła => true", a następnie błąd znika:

# Authenticates the current scope and gets the current resource from the session. 
def authenticate_scope! 
    send(:"authenticate_#{resource_name}!")) # deleted: :force => true 
    self.resource = send(:"current_#{resource_name}") 
end 

Więc zastanawiam co ": force => true" oznacza ... Dlaczego pojawia się błąd, gdy zostawiam go w miejscu? Przypuszczam, że złym pomysłem jest łatanie kodu gem w ten sposób. Ale co jeszcze mogę zrobić, aby uniknąć błędu?

Dzięki za pomoc!

Odpowiedz

19

Zdobione: problem został miałem nadpisane metody ...

def authenticate_user! 
    # do some stuff 
    # of my own here 

    # then hand over to Devise's method 
    super 
end 

... w ApplicationController. Ale to musi wyglądać następująco:

def authenticate_user!(options={}) 
    # do some stuff 
    # of my own here 

    # then hand over to Devise's method 
    super(options) 
end 

nadzieję, że pomoże ktoś pewnego dnia, może ...

+1

Chyba muszę powiedzieć teraz: Dzięki, @TomDogg, jesteś naprawdę mądry :-) – TomDogg

+0

Po dwóch godzinach nie rozumiejąc niczego (ale pogrążając się w zgłębianiu), dzięki! Mieliśmy dokładnie ten sam problem. Zasługujesz na wszystkie punkty uprzywilejowania od pytania, poprzez odpowiedź na komentarz! :) –

+0

Po prostu miałem ten sam problem, dzięki! – ABrowne