2015-10-03 106 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不是全局变量。它是控制器类的实例变量。当您的应用程序调用控制器时,将使用控制器类的实例,并且此实例变量将在控制器实例的上下文中可用。