我试图为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看起来像这样:
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没有初始化,这意味着我的控制器没有被用来渲染它。难道我做错了什么?
Edit2:也许我走在错误的轨道上。我想要一个Alchemy元素,该元素可以从数据库(自定义模型)中渲染东西。我所做的是创建一个呈现@some_values的元素。通过在可以放置此元素的每个页面类型上指定我的自定义控制器,我允许我的编辑者将这些@some_values放置在所需的位置。
看来这不是您想要的正确方法。由于路由原因,引入了用于页面布局的自定义控制器。这样,编辑者可以管理自定义控制器的导航。它们不用于装饰默认元素和页面呈现。
您可能想要的是on_page_layout
回调:http : //www.rubydoc.info/github/AlchemyCMS/alchemy_cms/Alchemy/OnPageLayout
在您的情况下:
class ApplicationController < ActionController::Base
extend Alchemy::OnPageLayout
on_page_layout :foo do
@some_values = Value.all
end
end
或者,甚至更容易地,将值加载到元素视图中。有点PHPish,但还可以。
编辑:
从性能的角度来看,在控制器中使用低级别的Rails缓存是一个好习惯:
...
on_page_layout :foo do
@some_values = Rails.cache.fetch('some/cache/key', expires_in: 10.minutes) do
Value.all
end
end
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句