我有三个控制器都继承自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
答案 0 :(得分:1)
如果您更改在应用程序控制器中将page_name
方法定义为:
def page_name
@page_name ||= ''
end
默认情况下,方法page_name
会将@page_name设置为空字符串,但也允许您通过page_name = "something_else"
而且 - @page_name
不是全局变量。它是控制器类的实例变量。当您的应用程序调用控制器时,将使用控制器类的实例,并且此实例变量将在控制器实例的上下文中可用。