【问题标题】:String Literal in rails method namerails方法名称中的字符串文字
【发布时间】:2014-05-08 20:56:40
【问题描述】:

如何将字符串文字传递给 ruby​​ 方法? (导轨 2.3.8) 我想实现如下示例:

 Class.find_by_"#{params[:column]}"

【问题讨论】:

标签: ruby-on-rails ruby string parameters escaping


【解决方案1】:

试试:

Class.send(:"find_by_#{params[:column]}", value)

【讨论】:

  • 你为什么把params[:column]改成字符串然后改成符号?
  • @MrYoshiji - params[:column] 是一个字符串,所以我不会把它变成一个字符串。我更喜欢将符号而不是字符串传递给send,因此我将其转换为符号。
【解决方案2】:

你可以使用.send("your_method", *your_args):

1.9.3p489 :027 > Object.send("try", :to_s)
 => "Object" 

在你的情况下:

Model.send("find_by_#{params[:column]}", params[:search_string])

另外,我强烈建议您对此进行一些安全检查

if Model.column_names.include?(params[:column].to_s)
  Model.send("find_by_#{params[:column]}", params[:search_string])
else
  # usually return nil or empty scope like `Model.where('FALSE')`
end

这将阻止使用不存在的列,并在您的应用中引发内部错误。

【讨论】:

  • 您好 Yoshiji,这不起作用。我必须将查询字符串传递得太正确
  • 嗨@Stacked-for-life,你能发布错误信息吗?
  • 语法错误,意外'(',期待')' ...(find_by_"#{params[:column]}"(params[:search_string]))
  • 我通过不同的模型方法发送列名@MrYoshiji 是的,虽然这会有所帮助
  • @Stacked-for-life 记住一件事:“永远不要相信用户的输入”,我希望你能在最终用户尝试搜索的列上添加验证
【解决方案3】:

在 Rails 4 中 - 这应该可以:

column_name = params[:column]
Class.find_by column_name.to_sym => value

【讨论】:

  • 为什么要把column_name改成符号,然后又改回字符串?
  • 毫无意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2023-03-15
  • 2014-01-15
  • 2012-06-17
  • 1970-01-01
  • 2014-05-03
相关资源
最近更新 更多