【问题标题】:Is it possible to load a Rails helper at run time?是否可以在运行时加载 Rails 助手?
【发布时间】:2010-09-28 13:21:57
【问题描述】:

我的视图可能会有很大差异,具体取决于特定用户选择的“模式”。

我以为我会将不同的行为提取到两个不同的 Helpers 中,然后在 Controller 中有这样的代码:

class MyController < ApplicationController

case mode
when 'mode1'
  helper "mode1"
when 'mode2'
  helper "mode2"
else
  raise "Invalid mode"
end

etc...

一旦加载了正确的帮助程序,则在两个帮助程序中定义的类似 的语句将为特定的“模式”加载正确的表单。

这在开发中运行良好,但在生产中,case 语句只运行一次。然后你就会被第一次加载的任何帮助程序卡住(杜赫!我应该知道的。)

我已经想到了其他方法来实现我需要做的事情,但我仍然认为使用 Helpers 是改变 View 行为的一种很好的干净方法。

有谁知道我如何在运行时加载(或重新加载)帮助程序?

TIA:约翰

【问题讨论】:

标签: ruby-on-rails ruby helper view-helpers


【解决方案1】:

我可以想到几种方法来做到这一点,但不确定是否按照您的建议加载模块。

加载不同的部分并根据状态选择要加载的部分。

<% if @mode = 'mode1 %>
  Mode 1:
  <%= render :partial => 'mode1' %>
<% else %>
  Mode 2:
  <%= render :partial => 'mode2' %>
<% end %>

或者,如果您想将该逻辑排除在视图之外(这可能是件好事),您可以在控制器中放置一些内容,以根据模式呈现不同的操作:

def index
   @mode = params[:query]
   case @mode
     when 'mode1' then render :action => "mode1"
     when 'mode2' then render :action => "mode2"
     else raise "Invalid mode"
   end
end

这似乎比将逻辑放在视图中要好得多。

【讨论】:

    【解决方案2】:

    在对这个问题进行了更多挖掘之后,我开始认为这是一个愚蠢的想法......在多用户系统上运行时替换模块的含义看起来不太好。

    除非有人提出一个改变我想法的好主意,否则我会在一天结束之前收回这个问题。

    -- 约翰

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多