覆盖子控制器

时间:2015-10-03 05:19:33

标签: ruby ruby-on-rails-4

我有三个控制器都继承自ApplicationController。 子控制器是:

HomeController

  • index

家庭控制器只有一种方法index,它只呈现一个表单。

TemplatesController

  • templates
  • save_page_name
  • preview

TemplatesController有三种方法。 templates列出了所有模板,preview打开了所选模板的预览。 save_page_name是从home#index提交的表单的终结点。

DesignsController

  • home
  • about

template#preview使用iframe呈现包含design#home的视图。

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

1 个答案:

答案 0 :(得分:1)

如果您更改在应用程序控制器中将page_name方法定义为:

的方式
def page_name
  @page_name ||= ''
end

默认情况下,方法page_name会将@page_name设置为空字符串,但也允许您通过page_name = "something_else"

分配不同的值

而且 - @page_name不是全局变量。它是控制器类的实例变量。当您的应用程序调用控制器时,将使用控制器类的实例,并且此实例变量将在控制器实例的上下文中可用。