2010-12-09 6 views
0

ich möchte eine Aktion von einer anderen Steuerung machen, aber ich habe den Fehler:Rails3 Rendering Aktion von einer anderen Steuerung

nicht definierte Methode `Formate für nil: NilClass

<script> 
$("#validate_company").live("keyup", function() { 
$("#company_info").html("<%= escape_javascript(render(:controller => 'live_validation', :action => 'validate_client_company')) %>"); 
}); 
</script> 

Dies ist der Controller:

class LiveValidationsController < ApplicationController 

def validate_client_company 
    if params[:first_name].length > 0 
    @client = Client.find_by_company(params[:company]) 
    if @client.nil? 
     @message = "<img src='/images/accepted_48.png' alt='Valid Username'/>" 
    else 
     @message = "<img src='/images/cancel_48.png' alt='Invalid Username' /> Name taken" 
    end 
    else 
    @message = "" 
    end 
    render :partial => "message" 
end 

end 

Die partielle _message ist nur

<%= @message %> 
+0

Post Ihre "Nachricht" teilweise und warum rendern Sie teilweise von Controller? – Bohdan

Antwort

2

Sie scheinen Dinge zu vermischen.

Sie haben HTML in Ihrer Controller-Methode? Das sollte Ihrer Meinung nach sein. Für jede Controller-Methode wird normalerweise eine Ansicht mit demselben Namen gerendert, außer Sie rufen innerhalb Ihrer Controller-Methode explizit render auf.

Sie schreiben nicht HTML in Ihrem Controller. Sie schreiben HTML in die Ansicht und manchmal haben Sie Helfer, um Ihre Ansichten lesbarer zu machen.

Zweitens, in Ihrem ersten Stück Code, die einige View-Code ist, hoffe ich. Die Ansicht wird serverseitig vorbereitet und anschließend an den Client gesendet. Sie können eine andere Ansicht, eine partielle, aus einer Ansicht rendern. Aber das lädt Daten nicht live.

Wie ich das beheben würde.In Ihrer Ansichten, in denen Sie dynamisch wollen die Validierung Render:

<script> 
    $("#validate_company").live("keyup", function() { 
    $("#company_info").load("<%= url_for :controller => 'live_validations', :action => 'validate_client_company' %>"); 
    }); 
</script> 

Dann in Ihrem Controller schreiben Sie:

class LiveValidationsController < ApplicationController 

    def validate_client_company 
    if params[:first_name].length > 0 
     @client = Client.find_by_company(params[:company]) 
     @error = @client.nil? ? :valid_username : :invalid_username 
    else 
     @error = nil 
    end 
    render :partial => "message", :layout => false 
    end 

end 

in Ihrem app/helper/live_validations_helper.rb fügen Sie eine Methode

def get_validation_message(error) 
    if error == :invalid_username 
    image_tag('/images/cancel_48.png', :alt => 'Invalid Username') + "Name taken" 
    elsif error == :valid_username 
    image_tag('/images/accepted_48.png', :alt => 'Valid Username') 
    end 
end 

und in Ihrem message view Sie schreiben etwas wie:

<%= get_validation_message(@error) %> 
+0

danke! Das Skript befindet sich in app/views/clients/new.html.erb, aber die Validierung wird nicht dynamisch gerendert. <% = url_for: controller => 'live_validations': action => 'validate_client_company' %> ist \t "/ live_validations/validate_client_company" und wenn ich navigieren Sie zu „/ live_validations/validate_client_company company = testnames? "Es macht die Validierung korrekt. – max

+0

Sie müssen den Parameter mitschicken. Ist es behoben? Oder muss es von der Eingabe kommen? Welcher Selektor ist das? Sie können Variablen in der 'load' Methode von jquery senden. – nathanvda

2

render :action => tut nicht führen Sie die zugehörige Controller-Methode.

Es wird einfach die Vorlage gerendert, die Rails standardmäßig mit der Aktion verknüpft hätte. Das heißt, wenn die Aktion validate_client_company einfach render aufgerufen wird, ohne Argumente zu übergeben, sucht Rails nach einer Vorlage in einem Ordner mit demselben Namen wie der Controller und mit einem Namen mit demselben Namen wie die Aktion. Der Aufruf render :action => sucht einfach nach der gleichen Vorlage und rendert sie.

Beste Schätzung ist, dass Rails eine Vorlage mit dem Namen validate_client_company nicht finden kann. Ich erwarte, dass keine existiert, weil die Aktion validate_client_company einen partiellen Namen message rendert, anstatt eine Vorlage mit dem Standardnamen für diese Aktion zu rendern.

In der Aktion, die das Skript macht, müssen Sie die Instanzvariablen einrichten und dann in der Vorlage für diese Aktion Sie folgendes benötigen:

render :partial => 'live_validations/message' 

es sicherlich Sinn macht Mini-MVC haben Stacks innerhalb des größeren MVC-Stacks, so dass Sie innerhalb von größeren Aktionen Unteraktionen ausführen können. Für dieses Szenario möchten Sie vielleicht Cells betrachten. Sie können dies jedoch nicht mit Rails allein tun.

0

Sie wollen wahrscheinlich etwas wie folgt aus:

<script> 
$("#validate_company").live("keyup", function() { 
$("#company_info").load("<%= url_for :controller => 'live_validation', :action => 'validate_client_company' %>"); 
}); 
</script> 

Aber der Rest des Codes ist ein bisschen von vermasselt ... eine teilweise aus dem Inneren eines Controller-Rendering?

0

Es hat funktioniert!

<script> 
    $("#validate_company").live("keyup", function() { 
     $("#company_info").load("/live_validations/validate_client_company",{company:$('#validate_company').val()}); 
    }); 
</script> 
Verwandte Themen