【问题标题】:Use a params[:value] to reference a controller method in Rails在 Rails 中使用 params[:value] 引用控制器方法
【发布时间】:2013-02-01 01:03:49
【问题描述】:

我目前有一个表单(使用 form_tag)。其中一个字段是选项的下拉列表。每个选项值都与我的控制器中的方法名称匹配。我想要做的是当点击表单提交按钮时,它会运行与下拉字段中选择的值直接对应的控制器方法。

我现在已经构建了一个解决方法,但感觉太冗长了:

def run_reports
  case params[:report_name]
    when 'method_1' then method_1
    when 'method_2' then method_2
    when 'method_3' then method_3
    when 'method_4' then method_4
    else method_1
end
# each method matches a method already defined in the controller 
# (i.e. method_1  is an existing method)

我曾认为使用下拉选项值通过 form_tag 操作(即:action => params[:report_name])在我的控制器中运行相应的方法可能会起作用,但这不起作用,因为操作需要在设置参数值之前设置表单中的内容。我不想为此功能使用 javascript。

这是我的表格:

<%= form_tag("../reports/run_reports", :method => "get") do %>
  <%= select_tag :report_name, options_for_select([['--  Please Select  --',nil],['Option 1','method_1'], ['Option 2','method_2'], ['Option 3','method_3'], ['Option 4','method_4']]) %>
  <%= submit_tag "Run Report" %>
<% end %>

有什么建议吗?

我可以改变我的控制器方法看起来像这样 - 但实际上调用控制器方法来运行?我猜这不会运行,因为 params 值作为字符串返回...

def run_reports
  params[:report_name]
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 forms


    【解决方案1】:

    警告:这是个糟糕的主意

    您可以在控制器中通过如下代码的 sn-p 调用该方法:

    send(params[:report_name].to_sym)
    

    这是一个糟糕的想法的原因是任何访问该页面的人都可以通过注入一个调用危险的请求来手动构造一个调用任何方法的请求。你真的,真的不想这样做。你最好设置一些东西来动态调用你的表单中已知的、受信任的方法。

    【讨论】:

    • 请注意,如果您首先验证params[:report_name] 已知是安全的,通过将其与受信任的方法列表进行检查,这并不是一个糟糕的主意。我不相信这是干净的设计,但很难确切地知道你想要做什么。
    • 谢谢吉姆。我想学习曲线的一部分不仅仅是学习如何使用 Rails 做事——而且还包括它是否是一个好主意。我一定会考虑您的建议,只处理受信任的方法。
    【解决方案2】:

    我认为您应该重新考虑您的应用程序的设计(基于我对它的了解很少)。您有一个负责运行报告的控制器,但实际上不应该这样做。控制器用于管理 Web 服务器与应用程序其余部分之间的连接。

    一种解决方案是编写一个名为 ReportGenerator 的新类,该类将运行报告并将结果返回给控制器,控制器将通过单个操作运行任何可能的报告(例如,show)。如果您需要可变视图,您可以使用与不同类型的报告相对应的部分视图。

    至于 ReportGenerator,您需要有点创意。完全有可能最好的解决方案是让一个单独的类来生成每种报告类型。

    【讨论】:

    • 谢谢扎克。我可能会很快重新构建网站。我只是想先得到一些作为概念证明的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多