1

Zum Beispiel stelle ich die partielle <%= render "layouts/location" %> in Ansichten auf der ganzen Website. Ich brauche einen Controller für das Layout (Ich habe versucht layouts_controller.rb), so konnte ich tunWie definieren Sie eine Funktion für partielle in einem Controller, um in allen Ansichten zu arbeiten? Ruby on Rails

def _location 
    @city = request.location.city 
    @state = request.location.state 
    end 

Die teilweise den Code enthält <%= @city %>, <%= @state %>

Das alles effektiv ist, soll die Stadt und den Staat des Besuchers angezeigt werden auf welcher Seite auch immer die partielle gerendert wird.

Wenn ich dies jedoch, und drücken Sie auf Heroku und migrieren Sie die Datenbank, ich bin die Fehlermeldung: Ein Fehler ist in der Anwendung aufgetreten und Ihre Seite konnte nicht bedient werden. Bitte versuchen Sie es in einigen Augenblicken erneut.

Wenn Sie der Besitzer der Anwendung sind, überprüfen Sie Ihre Protokolle für Details.

Die Frage ist also, wie definiere ich eine Funktion für eine partielle?

+0

Wird diese teilweise verwendet _a viel_? Weil Sie in 'ApplicationController' einen' before_filter' setzen könnten, der diese Variablen für Sie setzen würde. Selbst wenn Ihr Partial beispielsweise auf 40% Ihrer Seiten verwendet wird, wäre es keine große Sache, dass es bei jeder Anfrage einige Millisekunden dauerte, diese Variablen zu setzen. – MrDanA

+0

Yeh, wie 70% der Seiten, würde ich vor_filter dann def location? oder? Standort? oder ? – Laser

+0

Ich werde ein Beispiel als Antwort geben. – MrDanA

Antwort

3

Man könnte dies wie so in der Anwendung Controller vor Filter in einem tun:

... 
before_filter :location 

def location 
    @city = request.location.city 
    @state = request.location.state 
end 

Der Name der Methode das Symbol in dem before_filter Aufruf übereinstimmen muss, aber anders als das, können Sie den Anruf Methode, was auch immer Sie wollen. Die Methode muss jedoch in der ApplicationController-Klasse enthalten sein.

Erläuterung: Dies wird vor jeder Anfrage in Ihrer Anwendung aufgerufen und diese beiden Instanzvariablen für Sie festgelegt, so dass Sie in jeder Ansicht immer und automatisch Zugriff auf @city und @state haben.

2

Ich glaube, Sie können ein paar Verbesserungen von den anderen Lösungen machen.

In Application

class ApplicationController < ActionController::Base 
    before_filter :set_location, only: [:index, :show, :edit] 

    def set_location 
     @city = request.location.city 
     @state = request.location.state 
    end 
end 

Es ist wahrscheinlich, dass Sie nicht brauchen, diese Variablen für die Erstellung, Aktualisierung und zerstören Aktionen, so only: [...] mit scheint wie eine gute Idee. Sie können dort andere benutzerdefinierte Methoden hinzufügen. Das Hauptproblem dabei wird sein, wenn Ihre Aktion create fehlschlägt, und Sie die Seite "bearbeiten" rendern möchten. Wenn Sie diese Variablen nicht auf der Bearbeitungsseite benötigen, ist alles in Ordnung. Andernfalls müssen Sie set_location sich nennen:

def create 
    @lala = Lala.new(...) 
    @lala.save 
    set_location if @lala.errors.any? 
    respond_with @lala 
end 

Auch in der 30% der Seiten, die diese Variablen nicht benötigen, können Sie skip_before_filter verwenden:

class BlogsController < ApplicationController 
    #assume you dont need those variables in your blog 

    skip_before_filter :set_location # you can also use only: [:index, ...] here 
end 
1

Sie sollten eine nehmen Blick auf cells. Es ist ein tolles, aber eher unbekanntes Juwel, das es Ihnen erlaubt, Ihre Anwendung in "Zellen" zu strukturieren. Es könnte genau das sein, was du brauchst.

Verwandte Themen