如何为page_layout设置自定义控制器

时间:2016-09-08 09:58:11

标签: ruby-on-rails alchemy-cms

我正在尝试为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-Element,它可以从数据库中呈现内容(自定义模型)。我所做的是,创建一个呈现@some_values的元素。通过在每个可以放置此元素的页面类型上指定我的自定义控制器,我允许我的编辑将这些@some_values放在他们想要的位置。

1 个答案:

答案 0 :(得分: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,但还可以。

修改

从性能角度来看,在控制器中使用低级别rails缓存是一种很好的做法:

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