Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3:使用h(即html_escape)的助手应该住在哪里?_Ruby On Rails_Partial Views_Helper - Fatal编程技术网

Ruby on rails Rails 3:使用h(即html_escape)的助手应该住在哪里?

Ruby on rails Rails 3:使用h(即html_escape)的助手应该住在哪里?,ruby-on-rails,partial-views,helper,Ruby On Rails,Partial Views,Helper,我正在用RubyonRails3编写一个Web应用程序。Rails 3会自动转义任何潜在的坏字符串,这通常是一件好事,但这意味着如果您自己组装HTML,则必须在其上调用HTML\u safe 我有一个卡片模型,它有几个文本字段,这些字段的内容不可信(可能包含邪恶的HTML或脚本)。我有一个函数,它使用有关特定卡片的其他知识,对其中一个文本字段执行一些转换,以生成HTML输出。我想在我的应用程序的几个部分的几个地方嵌入这个函数生成的HTML 从概念上讲,这个助手与视图有关。但是,我找不到任何方法在

我正在用RubyonRails3编写一个Web应用程序。Rails 3会自动转义任何潜在的坏字符串,这通常是一件好事,但这意味着如果您自己组装HTML,则必须在其上调用
HTML\u safe

我有一个卡片模型,它有几个文本字段,这些字段的内容不可信(可能包含邪恶的HTML或脚本)。我有一个函数,它使用有关特定卡片的其他知识,对其中一个文本字段执行一些转换,以生成HTML输出。我想在我的应用程序的几个部分的几个地方嵌入这个函数生成的HTML

从概念上讲,这个助手与视图有关。但是,我找不到任何方法在我的视图文件中编写函数;似乎他们必须加入助手或控制器/模型

由于此函数非常特定于卡对象,因此下一个最佳选项是在my Card model Card.rb中具有一个函数:

class Card < ActiveRecord::Base
[...]
def format(unsafe_text)
  initial_text = h unsafe_text   # aka html_escape unsafe_text
  # assembles HTML output based on initial_text and fields of self
  output_text.html_safe!
end
但这两种方法都很容易产生危险的滑动(一种方法缺少
h()
,我们也遇到了问题),而且非常不干燥。目前,我正在使用partial来访问
h()
函数:

(in a normal view)
Rules text: <%= render 'formattext', :text=> @card.rulestext %>

(app/views/shared/_formattext.html.erb)
<%= @card.format(html_escape(text)) %>
(在正常视图中)
规则文本:@card.rulestext%>
(app/views/shared/_formattext.html.erb)
但这仍然让人感到危险。我所要做的就是在视图中对
format(sometext)
进行一次健忘调用,而不是调用
render'formattext',:text=>sometext
,这样我就得到了未经扫描的文本


有没有更好的办法?是否有方法将帮助器函数写入视图而不是模型或控制器中?

为视图转义内容是视图的责任,这就是为什么
h
帮助器在控制器或模型中不可用的原因

不过,我不明白为什么不能简单地清理视图中的内容

还要注意的是,在Rails3中,您不需要调用
h
helper。 默认情况下,除非您将内容标记为
html\u-safe,否则内容将自动清除


在模型中使用
h
辅助对象在逻辑上不正确的主要原因是模型应该独立于视图工作。换句话说,模型不应该关心内容是否将嵌入HTML文档或JSON文件(这需要与HTML不同的转义方法)。

转义内容以供查看是视图的责任,这就是为什么
h
帮助器在控制器或模型中不可用的原因

不过,我不明白为什么不能简单地清理视图中的内容

还要注意的是,在Rails3中,您不需要调用
h
helper。 默认情况下,除非您将内容标记为
html\u-safe,否则内容将自动清除


在模型中使用
h
辅助对象在逻辑上不正确的主要原因是模型应该独立于视图工作。换句话说,模型不应该关心内容是嵌入到HTML文档还是JSON文件中(这需要与HTML不同的转义方法)。

将执行视图程序集的逻辑放入CardHelper中:

app/helpers/card\u helper.rb

class CardHelper
  def rules(card)
    initial_text = h card.rules_text
    # assembles HTML output based on initial_text and fields of card
    output_text.html_safe
  end
end
从您的示例中不清楚是否要通过
format
方法格式化多个字段。如果是这样的话,那么您可以:

class CardHelper
  def format(card, attribute)
    initial_text = h card[attribute]
    # assembles HTML output based on initial_text and fields of card
    output_text.html_safe
  end
end
您可以像使用任何其他帮助器一样使用此帮助器:

class CardsController
  helper CardHelper
end
在你看来:

<%= rules(@card) %>


将查看部件的逻辑放入CardHelper:

app/helpers/card\u helper.rb

class CardHelper
  def rules(card)
    initial_text = h card.rules_text
    # assembles HTML output based on initial_text and fields of card
    output_text.html_safe
  end
end
从您的示例中不清楚是否要通过
format
方法格式化多个字段。如果是这样的话,那么您可以:

class CardHelper
  def format(card, attribute)
    initial_text = h card[attribute]
    # assembles HTML output based on initial_text and fields of card
    output_text.html_safe
  end
end
您可以像使用任何其他帮助器一样使用此帮助器:

class CardsController
  helper CardHelper
end
在你看来:

<%= rules(@card) %>



这一点很好。我希望助手在视图中而不是在模型中,因为它在概念上与视图有很大关系。但似乎没有任何方法可以在ERB中编写辅助函数。我想知道的是助手应该去哪里?(我在写这个问题的标题时就想到了这一点;我会编辑这个问题以使这个查询更清楚。)我知道我不需要使用
h
,除非我也使用
html\u-safe
。但是我使用的是
html\u-safe
,原因我已经解释过了——我正在组装自己的html字符串。这一点很好。我希望助手在视图中而不是在模型中,因为它在概念上与视图有很大关系。但似乎没有任何方法可以在ERB中编写辅助函数。我想知道的是助手应该去哪里?(我在写这个问题的标题时就想到了这一点;我会编辑这个问题以使这个查询更清楚。)我知道我不需要使用
h
,除非我也使用
html\u-safe
。但是我使用的是
html\u safe
,原因我已经解释过了——我正在组装我自己的html字符串。这样帮助类就可以在
html\u escape
h
上获得帮助?只有模型类不能?真奇怪。事实上,我不确定。。。如果没有,您可以将
ERB::Util
模块包含到您的助手类中。是的,只是验证了它。在app/helpers中定义的helper类中可以使用所有helper方法。因此helper类可以在
html\u escape
h
中获取?只有模型类不能?真奇怪。事实上,我不确定。。。如果没有,您可以将
ERB::Util
模块包含到您的助手类中。是的,只是验证了它。所有helper方法都可以在app/helpers中定义的helper类中使用。基本上,我的问题是我没有意识到helper与视图直接关联。一旦你知道了这一点,就很明显CardHelper是一个合适的地方