突变Rails中实例化的对象列表

时间:2018-10-08 17:27:16

标签: ruby ruby-on-rails-5

我试图通过将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 这样的特定属性,这不是很好。

以下是一些图片供参考。第一个是它的外观,第二个是我目前得到的

Unsanitized sources

Sanitized sources

1 个答案:

答案 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']