2016-09-08 2 views
0

Ich versuche meinen eigenen Controller für ein page_layout festzulegen, weil ich die Aktionen überschreiben möchte, um andere Modelle in die Ansicht zu bekommen.Wie setze ich einen benutzerdefinierten Controller für page_layout

Bearbeiten: Frontend-Rendering funktioniert jetzt. Nur Backend

Aus den docs Buggy ist, ich habe:

# config/alchemy/page_layouts.yml 
- name: index 
    unique: true 
    elements: [article, other_element] 
    autogenerate: [article] 
    controller: 'my_custom' 
    action: 'index' 

und erstellt eine app/controllers/my_custom_controller.rb:

# app/controllers/my_custom_controller.rb 
class MyCustomController < Alchemy::PagesController 
    def index 
    @some_values = Value.all 
    end 
end 

meine routes.rb lookes wie folgt aus:

Rails.application.routes.draw do 

    root 'my_custom#index' 

    devise_for :users, 
      path_names: { sign_in: 'login', sign_out: 'logout' }, 
      controllers: { sessions: 'users/sessions', passwords: 'users/passwords' } 

    mount Alchemy::Engine => '/' 

Die root-page hat den page_type-index in alchemy.

Und wenn ich zu localhost:3000 gehe ich bekommen, was ich will

Aber in der Alchemie Backend, wenn sie die Seite bearbeiten, erhalte ich einen Fehler beim Rendern:

NoMethodError in Alchemy::Admin::Pages#show 
Showing app/views/alchemy/elements/_some_element_view.html.erb where line #2 raised: 

undefined method `each' for nil:NilClass 
Extracted source (around line #2): 
<div class="row"> 
    <% for @value in @some_values %> 
     <%= render 'value/basic_view' %> 
    <% end %> 
</div> 

wahrscheinlich, weil die @some_values sind nicht initialisiert, was bedeuten würde, dass mein Controller nicht dazu benutzt wurde. Mache ich etwas falsch?

Edit2: Vielleicht bin ich auf der kompletten falschen Spur. Ich möchte ein Alchemie-Element haben, das Zeug aus der Datenbank rendert (benutzerdefinierte Modelle). Ich habe ein Element erstellt, das die @ some_values ​​rendert. Und indem ich meinen benutzerdefinierten Controller auf jedem Seitentyp spezifiziere, auf dem dieses Element platziert werden kann, erlaube ich meinen Editoren, diese @some_values ​​dort zu platzieren, wo sie wollen.

Antwort

0

Es sieht so aus, als ob dies nicht der richtige Ansatz für das ist, was Sie wollen. Benutzerdefinierte Controller für Seitenlayouts wurden aus Routing-Gründen eingeführt. So können Editoren die Navigation für benutzerdefinierte Controller verwalten. Sie sind nicht dafür gedacht, das Standardelement und das Seitenrendering zu dekorieren.

Was möchten Sie wahrscheinlich ein on_page_layout Rückruf: http://www.rubydoc.info/github/AlchemyCMS/alchemy_cms/Alchemy/OnPageLayout

In Ihrem Fall:

class ApplicationController < ActionController::Base 
    extend Alchemy::OnPageLayout 

    on_page_layout :foo do 
    @some_values = Value.all 
    end 
end 

Oder, noch einfacher, die Werte innerhalb der das Element Ansicht laden. Ein wenig PHPish, aber auch ok.

EDIT:

Aus Performance-Sicht niedriges Niveau unter Verwendung von Schienen-Cache in Ihrem Controller eine gute Praxis ist:

... 
on_page_layout :foo do 
    @some_values = Rails.cache.fetch('some/cache/key', expires_in: 10.minutes) do 
    Value.all 
    end 
end 
... 
+0

Danke, das wie ein Charme. Gibt es eine bevorzugte Möglichkeit zum Abrufen der Daten mit on_page_layout oder Abrufen in der Ansicht von Leistungspunkt (oder anderen Punkten) der Ansicht? – marges

+0

Es ist wirklich egal. Obwohl die Ansicht zwischengespeichert wird, sollten Sie darauf achten, dass Sie das Element jedes Mal aktualisieren müssen, wenn Sie einen Datensatz Ihrer Daten aktualisieren. Das Hinzufügen eines Cache in Ihrem Controller, der für 10 Minuten oder sogar eine Stunde gültig ist, ist problemloser. Es hängt wirklich davon ab, was Sie wollen. Ich empfehle den Controller-Rückruf zu verwenden. – tvdeyen

Verwandte Themen