Ruby on rails 是否可以省略“;“评估”;赞成;调用;或;“发送”;在我的情况下(Rails应用程序)?

Ruby on rails 是否可以省略“;“评估”;赞成;调用;或;“发送”;在我的情况下(Rails应用程序)?,ruby-on-rails,ruby,validation,eval,Ruby On Rails,Ruby,Validation,Eval,我是Ruby的新手,需要帮助,因为找不到答案:( 我有Rails应用程序,它的模型事件如下: class Event < ActiveRecord::Base before_validation :clean_input .... protected def clean_input fields = %w[title preview content] fields.each do |field| eval "self.#{field} = Action

我是Ruby的新手,需要帮助,因为找不到答案:(

我有Rails应用程序,它的模型事件如下:

class Event < ActiveRecord::Base
before_validation :clean_input

....

protected

  def clean_input
    fields = %w[title preview content]
    fields.each do |field|
      eval "self.#{field} = ActionController::Base.helpers.sanitize(self.#{field})"
    end
  end

end
因此,我的问题是:

1) 是否可以省略
eval…
而代之以
call
send
某种方式(我所有的尝试都是无用的)

2) 是否可以在验证前声明
:清除输入
如下
验证前清除输入:字段:{:标题,:预览,:内容}

1)确定:

2) 不需要,并且您当前的实现是正常的

1)确定:


2) 不需要,并且您当前的实现是正常的

因为您正在更新活动记录模型,所以有几个,例如:

def clean_input
  %i(title preview content).each do |field|
    self[field] = ActionController::Base.helpers.sanitize(self[field])
  end
end

由于您正在更新活动记录模型,因此有以下几种方法,例如:

def clean_input
  %i(title preview content).each do |field|
    self[field] = ActionController::Base.helpers.sanitize(self[field])
  end
end


@我觉得没有必要在私人场所为这种安全问题操心callback@apneadivingThanx,太好了!:)我不知道事情这么简单:)@sawa你说得对。我认为在我的情况下,省略
self
是可以的:)至少它的工作原理是一样的:)@sawa同意,虽然似乎能让人们重新认识到,但我不使用它,我自己将方法内容移动到helper来重用它,现在我的代码变得枯燥:)Thanx@我觉得没有必要在私人场所为这种安全问题操心callback@apneadivingThanx,太好了!:)我不知道事情这么简单:)@sawa你说得对。我认为在我的情况下,省略
self
是可以的:)至少它的工作原理是一样的:)@sawa同意,虽然似乎能让人们重新认识到,但我不使用它,我自己将方法内容移动到helper来重用它,现在我的代码变得枯燥:)Thanx!实际上,这可能会引入一个微妙的错误:您不再使用setter,而是直接处理对象,在大多数情况下都可以,但请注意…@kovpack-
send
更通用。在您的情况下,安全性不那么重要,因为您没有使用外部输入作为属性名称。如果您真的想了解这些差异,AR中的默认属性setter和getter是使用我建议中使用的API实现的,因此
send
解决方案比这个多了两个堆栈帧(这是无关紧要的…)。使用setter而不是直接处理对象是一种很好的做法。这不是一个
安全问题,只是一个很好的实践刚刚意识到同样的评论适用于getter here OK,很有趣你有两种方法来理解底层细节实际上这一种方法会引入一个微妙的错误:你不再使用setter,而是直接处理对象,在大多数情况下都可以,但请注意…@kovpack-
send
更通用。在您的情况下,安全性不那么重要,因为您没有使用外部输入作为属性名称。如果您真的想了解这些差异,AR中的默认属性setter和getter是使用我建议中使用的API实现的,因此
send
解决方案比这个多了两个堆栈帧(这是无关紧要的…)。使用setter而不是直接处理对象是一种很好的做法。这不是一个
secure
问题,只是一个很好的实践刚刚意识到同样的评论适用于getter here OK,很有趣,您有两种方法来理解底层细节
def clean_input
  %i(title preview content).each do |field|
    self[field] = ActionController::Base.helpers.sanitize(self[field])
  end
end