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.
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
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