我听说Ruby中使用以美元符号开头的全局变量被认为是不好的做法。Rails控制器也是这样吗?
例如,我有一个web应用程序,它使用一系列在连续阶段渲染的局部视图。第一阶段的用户输入取自param,并放入全局变量中,以便每个后续方法都可以访问。这些后期阶段需要容易地访问用户在早期阶段所做的选择。
routes.rb
post 'stage_one_form' => 'myexample#stage_two_form'
post 'stage_two_form' => 'myexample#stage_three_form'
post 'stage_three_form' => 'myexample#stage_four_form'
myexample_controller.rb
def stage_two_form
$stage_one_form_input = params[:stage_one_form_input]
end
...
def stage_four_form
@stage_four_displayed_info = $stage_one_form_input + "some other stuff"
end
这只是一个伪示例,但在这里使用全局变量似乎比我最初的方法要优雅得多,我的原始方法是通过使用隐藏字段在每个阶段将信息从客户端来回传递到服务器。
全局变量是否合适,或者有更好的方法吗?
如果您想存储第一阶段的输入并在第二阶段使用,那么您正在执行一种向导。您可以考虑使用session
或更健壮的东西来存储信息,而不是@NickM所说的配置或模型。
更多信息:
无向导宝石的Rails多步骤表单
http://railscasts.com/episodes/217-multistep-forms
其他信息
在使用应用程序服务器的生产部署中,您在这里对这些全局变量所做的操作将不起作用。在这些环境中,您需要多个进程(或线程),以便同时为多个网站访问者提供服务。
有了这两个,你会有两个问题:
- 为一个访问者设置变量将影响该进程/线程所服务的下一个访问者(即使是另一个人)的体验
- 一个相关的问题是,一个访问者根本不能保证在他们的下一个请求中由同一个进程提供服务,因此为他们的第二个请求提供服务的进程/线程可能不会从他们的第一个请求中设置全局变量
总之,混沌,使用session
——这正是它的用途。
您可以将它们放入config/application.rb或config.yml文件中。
config.your_variable = 'something'
然后从你的应用程序中调用它
<%= Rails.configuration.your_variable %>
或者你可以把它扔到控制器里:
class Foo
MY_VARIABLE = 'something'
end
然后在你看来称之为:
<%= Foo::MY_VARIABLE %>
或者你可以把它放在控制器中的一个方法中,并定义一个助手:
class FooController
def my_variable
'something'
end
helper_method :my_variable
end
关于config.yml的更多信息:为我的Rails应用程序创建自定义配置选项的最佳方式?
但是,如果您需要在不同阶段访问一个变量,您可能需要将其转储到控制器中的会话变量中:
session[:stage] = 'something'
并稍后使用session[:stage]访问它然后您可以在流程再次启动时清除它:
session[:stage] = nil