我仍然是新手,并遇到一个相当奇怪的问题(至少从我的角度来看): 在控制器中有一个带有表单和路径以及方法的视图。不知何故,该方法被直接调用而不是渲染视图,等待输入并将其传递给方法。
这就是它的样子:
控制器
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中的任何内容。
我无法弄清楚出了什么问题。也许今天为时已晚......
答案 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
视图进行响应。text_fields
中的参数被包含在内,您可以使用它来进行计算。答案 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
操作将会处理参数。