2015-10-03 107 views
0

我有三個控制器都從ApplicationController繼承。 孩子控制器是:覆蓋子控制器中父控制器的實例變量

HomeController

  • index

家庭控制器只有一個方法,index,它只是呈現形式。

TemplatesController

  • templates
  • save_page_name
  • preview

TemplatesController有三種方法。 templates列出所有模板並preview打開所選模板的預覽。 save_page_name是從home#index提交的表單的終點。

DesignsController

  • home
  • about

template#preview呈現與含有design#home一個iframe的圖。

DesignsController中的每個方法都需要從表單中設置的值來獲取數據。 (數據正在從API中提取。)

現在。我想爲DesignController創建一個全局可訪問的變量。即我想讓價值來自全球的形式。所以我把一些代碼在父控制器

這裏是我的代碼:

class ApplicationController < ActionController::Base 

    protect_from_forgery with: :exception 
    before_action :page_name 

    def page_name 
    @page_name = '' 
    end 
end 

,並打算在重寫它template#save_page_name

def save_page_name 
    @page_name = params[:page_name] 
    test_page_name = PageName.new 
    test_page_name.name = @page_name 

    if test_page_name.save 
    redirect_to(controller: 'template', action: 'templates') 
    end 
end 

這是形式

<%= form_tag({controller: 'application', action: "save_page_name"}, class: "nifty_form") do%> 
<%= text_field_tag :page_name %> 

這是模板控制器

class TemplateController < ApplicationController 
    def templates 
    end 

    def preview 
    end 
end 

設計控制器

class DesignController < ApplicationController 
    def home 
    @info = @page_name //should be global var 
    render :template => "design/"+params[:template]+"/home" 
    end 
end 
+0

你的問題是什麼? – spickermann

+0

@spickermann,首先感謝我的英語我試圖從子類中覆蓋父類的實例變量。 – Raaz

+0

你有什麼問題?有錯誤嗎? – spickermann

回答

1

如果你改變你的應用程序控制器定義page_name方法的方式:

def page_name 
    @page_name ||= '' 
end 

的方法page_name會默認情況下,將@page_name設置爲空字符串,但也允許您通過分配不同的值

而 - @page_name不是全局變量。它是控制器類的實例變量。當您的應用程序調用控制器時,將使用控制器類的實例,並且此實例變量將在控制器實例的上下文中可用。