【问题标题】:Rails 4 - Passing parameter from view to controller using form_tagRails 4 - 使用 form_tag 将参数从视图传递到控制器
【发布时间】:2014-12-01 08:04:48
【问题描述】:

我有一些看似简单的事情需要帮助,目前正在使用 Rails 4 和 Ruby 2.1.0

我正在处理工资单索引页面,用户可以从页面上的 select_tag 中选择一周。我的工资单控制器中有一个@current_week 变量,我想将参数传递给它,但是使用form_tag 这样做时遇到了一些麻烦。到目前为止,这是我所得到的:

index.html.haml

%h1 Payroll Index
%h6= "Current Week: #{@current_week}"
.week_selector
=form_tag payroll_path, action: :update_week do
    =select_tag :current_week, options_from_collection_for_select(@weeks, 'id', 'start_date')
    =submit_tag

payroll_controller.rb

class PayrollController < ApplicationController
  def index
    @weeks = Week.all
    @current_week = params[:current_week] || Week.this_week.display_date
  end

  def update_week
    @current_week = params[:current_week] 
  end
end

routes.rb

Project::Application.routes.draw do
  resources :payroll, only: [:index, :update] do
    post '/:update_week' => 'payroll#index', as: :payroll
  end
...

理想情况下,我希望用户能够提交表单,只需更新控制器中的@current_week 变量,仍然停留在索引页面上。肯定有一种我缺少的简单方法可以做到这一点吗?

我在路线和形式上尝试了几种不同的组合,但没有取得太大进展。任何帮助,将不胜感激。谢谢!

更新:

按照infused的建议,我把表格改成如下:

  =form_tag payrolls_path, method: :get do
    =select_tag :current_week, options_from_collection_for_select(@weeks, 'id', 'start_date')
    =submit_tag

并收到以下错误:

undefined local variable or method `payrolls_path' for #<#<Class:0x00000101e045a0>:0x0000010c3af450>

根据要求,这是rake routes的相关输出:

 Prefix Verb   URI Pattern                                 Controller#Action
   payroll_payroll POST   /payroll/:payroll_id/:update_week(.:format) payroll#index
     payroll_index GET    /payroll(.:format)                          payroll#index
           payroll PATCH  /payroll/:id(.:format)                      payroll#update
                   PUT    /payroll/:id(.:format)                      payroll#update
         employees GET    /employees(.:format)                        employees#index

谢谢!

【问题讨论】:

    标签: ruby forms ruby-on-rails-4 parameters


    【解决方案1】:

    如果您想将 current_week 参数发送到您的索引路径,请将方法设置为 GET:

    = form_tag payroll_index_path, method: :get do
    

    默认情况下,form_tag 将使用 POST,它不会路由到索引。

    【讨论】:

    • 感谢您的快速响应...我曾尝试过该路线,但出现错误:No route matches {:action=&gt;"update", :controller=&gt;"payroll"} missing required keys: [:id] 我已尝试将内容传递到 payroll_path,但鉴于它是一个索引,这似乎很愚蠢查看?
    • 在您的表单中尝试payrolls_path。如果这不起作用,请使用 rake routes 的输出更新您的问题以获取工资单路线。
    • 根据您的路线输出,您应该使用payroll_index_path
    • 我也尝试过,但同样出现missing required keys: [:id] 错误。结果,我一直在将不同的参数传递给它,但没有运气。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多