我想为page_layout设置自己的控制器,因为我想重写将其他模型放入视图的操作。如何为page_layout设置自定义控制器
编辑:现在前端渲染工作。只有后端是越野车
从文档,我所做的:
# config/alchemy/page_layouts.yml
- name: index
unique: true
elements: [article, other_element]
autogenerate: [article]
controller: 'my_custom'
action: 'index'
,并创造了app/controllers/my_custom_controller.rb
:
# app/controllers/my_custom_controller.rb
class MyCustomController < Alchemy::PagesController
def index
@some_values = Value.all
end
end
我的routes.rb lookes这样的:
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 => '/'
的根页面在炼金术中具有page_type索引。
当我去到localhost:3000
我得到了我想要
但在炼丹后台,编辑页面的时候,我在渲染时出现错误:
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>
可能的,因为@some_values没有初始化,这意味着,我的控制器不用于渲染。 我做错了什么?
编辑2:也许我在完全错误的轨道上。我想要一个炼金术元素,它呈现数据库中的东西(自定义模型)。我所做的是创建一个元素,呈现@some_values。通过在每个可以放置此元素的页面类型上指定自定义控制器,我允许编辑将这些@some_values放在他们想要的位置。
谢谢,这工作就像一个魅力。 有没有一种首选的方法来获取数据,使用on_page_layout或从性能点(或其他点)的视图中提取? – marges
真的没关系。虽然视图被缓存,但要注意,每次更新数据记录时都需要更新元素。在您的控制器中添加一个有效时间为10分钟或甚至一小时的缓存更加容易。这真的取决于你想要什么。我建议使用控制器回调。 – tvdeyen