【问题标题】:Passing Multiple Parameters in a form_tag在 form_tag 中传递多个参数
【发布时间】:2012-07-30 13:02:52
【问题描述】:

我正在使用 Rails 和 jqPlot 在网页上显示一些数据。图表需要按日期灵活(例如,用户可以选择时间范围,图表会自行更新)。到目前为止,这是我的代码(在我看来):

<%= form_tag home_event_trends_path(params[:timePeriod]), :method => 'post' do %>
  <p>
    <%= select_tag :timePeriod, options_for_select(["2 Hours Ago", "1 Week Ago", "3 Months Ago"], :selected => params[:timePeriod]) %>
    <%= submit_tag "Refresh", :name => nil %>
  </p>
<% end %>

Home 是我的控制器,event_trends 是一个动作,我想。 (路径为localhost:3000/home/event_trends.3102030)

这很好用。但是,我还需要将另一个参数传递给我的控制器。这个网页已经有一个参数传递给它,params[:format](这是 URL 中的 3102030,它会根据我要显示的事件而变化),我也需要传递这个参数。我试过了:

home_event_trends_path(params[:timePeriod][:format])
home_event_trends_path(params[:timePeriod],[:format])
home_event_trends_path(params([:timePeriod][:format]))

等等。

如何让我的控制器从我的视图中查看多个参数?

【问题讨论】:

  • 我建议避免使用 params[:format] 因为 Rails 使用它来知道要呈现的类型(JSON、JS、XML、HTML ...)。也看看guides.rubyonrails.org/form_helpers.html。这将帮助您了解表单在 Rails 中的工作方式
  • @AnthonyAlberto:我没有选择 :format,结果就是这样。我不知道如何改变它。此外,我一直在那个页面上上下下,这一切都在我的脑海中......

标签: html ruby-on-rails forms ruby-on-rails-3.2 ruby-1.9.3


【解决方案1】:

没有反对 Idan 的回答,但这就是我最终要做的事情(对于未来的 Google 员工...)

在我看来:

<%= form_tag home_event_trends_path, :method => 'get' do %>
  <p>
    <%= select_tag :timePeriod, options_for_select(["2 Hours Ago", "1 Week Ago", "3 Months Ago"], :selected => params[:timePeriod]) %>
    <%= text_field_tag :issue, params[:issue] %>
    <%= submit_tag "Refresh", :name => nil %>
  </p>
<% end %>

然后在我的 Home Controller 中:

def event_trends
  @eventTrend = Home.eventTrend(params[:timePeriod], params[:issue])
end

最后是模型:

def self.eventTrend(date, id)
  # dirty work
end

这似乎最适合我。我决定允许更改 GET 请求的 URL,并立即将 issue 参数存储在搜索框中,以备后用。

希望这对将来的任何人都有帮助!

【讨论】:

    【解决方案2】:

    我看到您正在使用 GET 传递 旧的 timePeriod 并使用 POST 传递新的 timePeriod。这真的是你想要的吗?为什么控制器需要旧的timePeriod

    既然你想显示一个图表——也就是说,你想检索数据,而不是造成副作用——我认为你应该只使用 GET 发送新的timePeriod

    <%= form_tag home_event_trends_path(), :method => 'get' do %>
        <p>
            <%= select_tag :timePeriod, options_for_select(["2 Hours Ago", "1 Week Ago", "3 Months Ago"], :selected => params[:timePeriod]) %>
            <%= select_tag :format, options_for_select([...], :selected => params[:format]) %>
            <%= submit_tag "Refresh", :name => nil %>
        </p>
    <% end %>
    

    另外,我同意 Anthony 的观点 - 您应该尝试更改 format 参数 - 只需在控制器中查看它的使用位置,然后更改名称。

    【讨论】:

    • 我不明白你所说的OLD和NEW timePeriod是什么意思?当用户从下拉菜单中选择一个新选项并点击“刷新”时,浏览器会将timePeriod 发送到服务器端 Rails,此时它会在新的时间范围内查询我的数据库,并返回那些适合的条目。我使用 POST 是因为我想避免在 URL 中包含参数。
    • 您将params[:timePeriod] 发送到home_event_trends_path - 这意味着params[:timePeriod] 是表单目标路径的一部分。该函数在 HTML 页面的呈现期间被调用 - 这意味着发送给用户的 HTML 表单已经包含带有params:[timePeriod] 的路径 - 并且发生在用户选择时间段之前形式 - 因此它是 old timePeriod。关于发送方法,这确实是您的选择,但无论如何,最简单的方法是将所有参数作为表单元素发送。
    • 好的,有道理。在重新工作后,我将所有内容都更改为 GET。我也将(我认为):format 重命名为:issue。您的代码实际上为我创建了另一个下拉列表。这不是必需的,因为用户不应该能够从页面中选择问题。我只想传递当前的问题(如 URL 中定义的)。此外,我设法更改了 URL,使其为/home/event_trends?issue=123456。当我单击刷新时,此问题参数将替换为/home/event_trends?utf8=✓&amp;timePeriod=3+Months+Ago。我还需要两个!
    • 如果您不希望用户选择issue(在此表单中。在较早的时候用户确实需要以某种方式选择它...),您可以使用@987654321 @ 将该参数添加为表单元素。您也可以将其作为表单的操作路径发送(就像您在问题中的代码示例中尝试发送 timePeriod 一样),但它往往会创建更丑陋的代码,除非您需要混合使用 GET 和发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多