路线会立即跳过视图和调用方法

时间:2014-02-07 22:57:01

标签: ruby-on-rails

我仍然是新手,并遇到一个相当奇怪的问题(至少从我的角度来看): 在控制器中有一个带有表单和路径以及方法的视图。不知何故,该方法被直接调用而不是渲染视图,等待输入并将其传递给方法。

这就是它的样子:

控制器

class Some::ThisController < ApplicationController

  def method_a
    variable_a = params[:variable_a].to_time
    variable_b = #other stuff
    @variable_c = # do stuff with the variable_a & variable_b

  end

查看(method_a.rb)

= form_tag this_method_a_path do
  = text_field_tag :variable_a
  = text_field_tag :variable_a
  = submit_tag 'Apply'

路线(some.rb)

The::Application.routes.draw do

  namespace :some do

    # leave all the unimportant stuff

    match this/method_a => this#method_a, :as => :method_a

那么我的问题是什么? 视图没有呈现 - 我只得到: nil的未定义方法`to_time':NilClass 当我重命名方法时,视图渲染得很好。

我想要什么? 要渲染的视图,所以我可以填写表单并提交它,然后让方法返回@variable_c中的任何内容。

我无法弄清楚出了什么问题。也许今天为时已晚......

2 个答案:

答案 0 :(得分:1)

您需要两个独立的控制器方法,一个用于呈现视图,另一个用于接受表单的提交。当你在method_a中时,params[:variable_a]将无法使用,因为该表单尚未提交,只是正在呈现!

试试这个:

class Some::ThisController < ApplicationController

  def method_a
    # nothing, just let Rails render the method_a view
  end

  # this will accept the submission of the form 
  def method_b
    variable_a = params[:variable_a].to_time # this will now be available because the user has submitted the form
    variable_b = #other stuff
    @variable_c = # do stuff with the variable_a & variable_b

将新方法添加到路线:

The::Application.routes.draw do

  namespace :some do

    # leave all the unimportant stuff

    get 'some/method_a' => 'some#method_a', :as => :method_a
    post 'some/method_b' => 'some@method_b'. :as => :method_b

现在您的观点将是:

= form_tag method_b_path do 
  = text_field_tag :variable_a
  = text_field_tag :variable_b
  = submit_tag 'Apply'

当用户点击提交按钮时,参数:variable_a:variable_b将被发布到控制器中的method_b操作,您将能够拨打params[:variable_a]或b。

如果您不明白这是如何工作的,这可能会有所帮助:

  • 用户访问路径GET /some/method_a,您的应用会通过控制器中的method_a操作接收请求,并通过呈现method_a.html.erb视图进行响应。
  • 表单已呈现,用户填写表单并点击提交,向控制器中的method_b操作发送请求。随着此请求,text_fields中的参数被包含在内,您可以使用它来进行计算。

Hope that's clear enough.

答案 1 :(得分:-1)

嗯,这在很大程度上取决于你如何称呼你的路线。

是获取请求吗?网址定义的“variable_a”?在这种情况下,您没有在路线中定义它,因此它变为空...

或者是帖子/补丁请求?在这种情况下,你很可能会有一个表单发布到路由,因此有一个控制器方法...但你需要首先渲染表单。

那么,你应该拥有的是:

控制器中的一种方法,可以将表单视图称为“get”

在您的情况下,就像添加路线一样简单:

match "this/method_a", to: "controller#draw_form", via: 'get'

在您的控制器中

def draw_form
   render "method_a"
end

然后,当您的表单发布到相同的网址(路由中的“this / method_a”)时,您的控制器中的method_a操作将会处理参数。