2016-09-08 39 views
0

我想为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放在他们想要的位置。

回答

0

看起来这不是你想要的正确方法。由于布线原因,引入了用于页面布局的自定义控制器。这样编辑人员可以管理自定义控制器的导航。它们不是用来装饰默认元素和页面渲染的。

你可能想要的是一个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,但也可以。

编辑:

从使用低级别性能的角度轨高速缓存控制器是一个很好的做法:

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

谢谢,这工作就像一个魅力。 有没有一种首选的方法来获取数据,使用on_page_layout或从性能点(或其他点)的视图中提取? – marges

+0

真的没关系。虽然视图被缓存,但要注意,每次更新数据记录时都需要更新元素。在您的控制器中添加一个有效时间为10分钟或甚至一小时的缓存更加容易。这真的取决于你想要什么。我建议使用控制器回调。 – tvdeyen

相关问题