【问题标题】:Interpolate in variable rails在可变轨道中插值
【发布时间】:2017-06-15 07:34:11
【问题描述】:

我正在尝试根据 url 传递的参数使我的页面动态化。我想使用参数来改变这样的变量

<h3><%= "$subproject_title_#{params[:num]}_1" %></h3>

显然,这只是打印字符串,但如果我删除引号,则一半的行会被注释掉。 这样做的正确方法是什么?

【问题讨论】:

  • public_send("$subproject_title_#{params[:num]}_1")
  • @AndreyDeineko 这给了我一个未定义的方法错误。
  • 你能用instance variables代替全局吗?
  • 您可以在控制器中决定它,您不能直接在视图中访问参数。
  • @JustusP 你真的应该看看 Stefan 的回答。 eval 解决方案是完全不安全的。如果您找到了答案,请将其标记为已接受的答案。

标签: ruby-on-rails ruby interpolation


【解决方案1】:

一些经验法则:

  • 不要使用全局变量
  • 不要动态构建变量
  • 不要使用eval

此外,尽量避免在您的视图中访问params,这应该在控制器中处理。

您可以使用实例变量来代替全局变量。它们在您的控制器和视图之间共享。

您可以使用散列代替动态生成的变量:

@titles = {
  '1' = 'title one',
  '2' = 'title two',
  '3' = 'title three',
}

然后,您可以使用Hash#fetch 代替eval 来获取给定num 的值。

您可以将该值分配给控制器中的实例变量:

def index
  @title = @titles.fetch(params[:num], 'default title')
end

可以在你的视图中访问该实例变量:

<h3><%= @title %></h3>

您还可以创建一个带有title 和(唯一)num 属性的Page 模型来存储您的页面详细信息。对控制器的更改非常简单:

def index
  @page = Page.find_by(num: params[:num])
end

在你看来:

<h3><%= @page.title %></h3>

【讨论】:

    【解决方案2】:
    eval("$subproject_title_#{params[:num]}_1")
    

    【讨论】:

    • eval 是一个非常强大的工具。你应该避免它,除非你真的知道你在做什么。该特定代码容易受到代码注入的影响。例如,将:num 设置为";_1=`ls`;" 将使您的视图打印目录列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2012-02-08
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多