我试图通过将Rails的消毒方法移到帮助程序上来清理我的视图,但是没有产生期望的结果。所以下面是我的索引操作的样子。我知道它很丑,而且不是非常面向对象,但是我简化了它,以便可以跟踪调试时发生的情况。
我正在尝试遍历所有源的属性,对非空字符串的任何属性运行清理程序,用清理过的字符串(transform_values!)替换原始字符串,并覆盖原始@sources(地图!)。
我尝试将它们存储在与import React from 'react'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import App from './components/App'
import Home from './pages/Home'
import Page from './pages/Page'
import Blog from './pages/Blog'
/* construct routes */
export default () => {
return (
<Router>
<App>
<Switch>
<Route path='/' exact component={Home} />
<Route path='/blog/:slug' component={Blog} />
<Route path='/:slug' component={Page} />
</Switch>
</App>
</Router>
)
}
不同的变量中,并使用@sources
而不是.each
,但是经过清理的值无法通过。
.map!
但是,在查看了我在视图中的源列表之后,它将删除源实例,而是返回一个非描述性的哈希数组。我可以遍历这些内容,但是不能调用诸如def index
@sources = Source.all
@sources.map! { |source|
source.attributes.transform_values! { |attr|
attr.blank? || !attr.is_a?(String) ? attr
: ActionController::Base.helpers.sanitize(attr) } }
end
这样的特定属性,这不是很好。
以下是一些图片供参考。第一个是它的外观,第二个是我目前得到的
答案 0 :(得分:0)
map!
用该块的结果替换数组中的每个项目。这不是您要执行的操作,因为您只想更改项目,而不用其他内容替换它们。使用普通的each
而不是map!
可以解决问题。
另一方面,清理实际上是视图的责任(这就是为什么在帮助程序中对其进行定义的原因)。如果需要经常使用相同的参数进行消毒,请定义自己的帮助器:
class ApplicationHelper
def sany(str)
sanitize(str, %w[...])
end
end
<%= sany(source.some_attr) %>
您还可以根据文档设置默认的消毒选项:
# In config/application.rb
config.action_view.sanitized_allowed_tags = ['strong', 'em', 'a']
config.action_view.sanitized_allowed_attributes = ['href', 'title']