2017-09-21 26 views
-1

Ich habe eine Methode:nicht definierte Methode Fehler bei der Verwendung von send() Methode

def complete_sign_in(user, redirect_path, flash_type, message) 
     sign_in user 
     remember user 
     flash[send(flash_type.to_sym)] = message 
     redirect_to send(redirect_path.to_s) 
    end 

Das ich so nennen:

complete_sign_in(@user, 'register_optional_path', 'success', 
        t(:account_activated)) 

Aus irgendeinem Grunde 'register_optional_path' gut funktioniert, aber wenn ich versuche zu setzen Blitz der Typ 'success' es gibt mir eine Fehlermeldung:

NoMethodError: undefined method `success' for ... 

Jede Idee, warum es so verhält und wie etwas reparieren?

Antwort

0

Sie können solche Fehler vermeiden, wenn Sie send nicht verwenden. Wenn Sie die Zeichenfolgenwerte für und flash_type übergeben, können Sie to_sym verwenden, um die Route für die Umleitung zu erstellen, und der Schlüssel flash[:success] kann als Zeichenfolge oder Symbolschlüssel verwendet werden, sodass Sie direkt darauf zugreifen können, ohne zu verwenden Noch .to_s noch nicht einmal senden.

Sie könnten versuchen, mit:

def complete_sign_in(user, redirect_path, flash_type, message) 
    sign_in user 
    remember user 
    flash[flash_type] = message 
    redirect_to redirect_path.to_sym 
end 

Ich denke, man könnte etwas Ihre Methode optimieren, wie:

def sign_and_remember(user) 
    [method(:sign_in), method(:remember)].each { |method| method.call(user) } 
end 

def complete_sign_in(options={}) 
    sign_and_remember(options[:user]) 
    flash[options[:flash]] = options[:message] 
    redirect_to options[:path].to_sym 
end 

So können Sie es aufrufen, indem Sie einen Hash mit den benötigten Werte übergeben:

options = { 
    flash: 'success', 
    message: t(:account_activated), 
    path: 'register_optional', 
    user: @user 
} 
complete_sign_in(options) 
0

Das Problem ist, dass es keine Methode success genannt wird. Dafür muss man aber trotzdem einen String oder ein Symbol übergeben.

es wie folgt umschreiben:

def complete_sign_in(user, redirect_path, flash_type, message) 
    sign_in user 
    remember user 
    flash[flash_type.to_sym] = message 
    redirect_to send(redirect_path.to_s) 
end 

Ich würde Ihnen empfehlen, auch die redirect_path Variable neu zu schreiben und in direkt die Methode senden

wie folgt aus:.

def complete_sign_in(user, redirect_path, flash_type, message) 
    sign_in user 
    remember user 
    flash[flash_type.to_sym] = message 
    redirect_to redirect_path 
end 

Jetzt können Sie nenn es so:

complete_sign_in(@user, register_optional_path, 'success', t(:account_activated)) 
Verwandte Themen