是否可以在运行时加载Rails助手?

时间:2008-12-27 18:17:29

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

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

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

class MyController < ApplicationController

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

etc...

加载正确的帮助程序后,会出现类似&lt;%= edit_item%&gt;的语句。 ,在两个助手中定义,将为特定的“模式”加载正确的形式。

这在开发中非常有效,但在生产中,case语句只运行一次。然后你就会被第一次加载的任何助手困住(Duh!我应该知道的。)

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

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

TIA:John

2 个答案:

答案 0 :(得分:1)

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

除非有人提出改变主意的好主意,否则我会在当天结束时撤回这个问题。

- 约翰

答案 1 :(得分: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

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