2016-09-08 38 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

相關問題