将 Rails 代码从控制器移动到助手时如何修复它?

Posted

技术标签:

【中文标题】将 Rails 代码从控制器移动到助手时如何修复它?【英文标题】:How to Fix Rails Code when Moving it From Controller to Helpers? 【发布时间】:2013-08-14 16:02:12 【问题描述】:

在我网站上的每个 text_area 上,我都有一个用于选择语言的 select_box。它经常使用某些默认语言,但有时会检查自定义选项。我最初在控制器中设置了数组:

@language_array = [  ["english", 1], ["french", 2], ["spanish", 3]  ]
@language_array = get_custom_array if custom_language?

然后它会被视图访问:

 <%= select_tag(:language, options_for_select(language_array, default_language) )%>

这很好用,text_area 会显示语言并传递数字。但是,我现在想为每个页面添加多个 text_area,所以我将代码移到了一个帮助器中,并从视图中的每个 text_area 访问该帮助器:

language_array = get_language_array(thing.id)
<%= select_tag(:language, options_for_select(language_array, default_language) )%>

但是,现在 text_area 出现混乱,并显示数组而不仅仅是语言:

["英文", 1]

如何修复它(不更改当前存储的数组)?我还希望帮助程序中的变量可用于页面上的 javascript。有没有比将所有东西从控制器转移到助手更好的方法来处理多个“事物”?

【问题讨论】:

【参考方案1】:

您可以将它们作为这样的散列放在模型中

user.rb

 def User
    def self.language
      
      'English' => '1',
      'French' => '2',
       ....
      
    end
 end

并在控制器中获取哈希到一个变量中,它可以在 html.erb 和 js.erb 中访问

users_controller.rb

@language = User.language

然后在构建表单时,您可以这样做

<%= talent_field.select(:language, @language, , :class => 'language-select' %>

【讨论】:

是的,我应该将更多的东西移到模型中(尽管作为一个常规的实例方法),我也可以保持它以前的形式。谢谢。

以上是关于将 Rails 代码从控制器移动到助手时如何修复它?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

如何将 Rails 视图助手提取到 gem 中?

如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?

Rails - 如何将生成的 URL 修复为友好的 URL

如何从 rails 模块访问 URL 助手

从移动设备访问 rails 应用程序