2

我正在尝试将表单的输入链接到我的 rails 应用程序中的特定操作。

目前,如果我去www.myapp.com/check/:idNumber,我将能够很好地触发动作(这意味着路由设置正确?)。这个动作基本上是对 ruby​​/rails 脚本的函数调用,参数“idNumber”被传递给它。如果函数成功,它将返回一个新创建的“Person”对象,否则返回 nil。这与标准new操作不同,因为它根据从其他地方的数据库中获得的一些信息来确定属性。

耙路线确实给了我以下信息:

   check        /check/:idNumber(.:format)    person#check {:id=>/\d+/}

我无法实现的是表单本身。

<%= form_tag("/check", :method => "get") do %>
  <%= text_field_tag(:idNumber) %>
<% end %>

控制器动作:

  def check
    regCheck = RegCheck.new  

    @person = regCheck.check_id(params[:idNumber])

    if @person.name == nil
      redirect_to root_path
    end
end

提交上面的表格会带我去myapp.com/check?utf8=✓&amp;idNumber=1234。有人可以告诉我我做错了什么吗?

4

3 回答 3

4

我相信使用check_path从路由文件生成的助手是你最好的选择。

表格应该看起来像这样。

<%= form_tag(check_path) do %>
  <%= text_field_tag(:idNumber) %>
<% end %>
于 2013-04-13T06:37:05.307 回答
1

Rails 表单可能很挑剔,尤其是在尝试构建真正定制的表单时。

这条线
= form_for [@object]

确定表单的去向,以及正在实现的对象。如果要将表单路由到其他位置,可以使用该:url选项。此选项确定表单的路径,但是您必须记住该方法由@object. 如果是新对象,则方法为 POST,现有对象将使用 PUT 方法。

假设您要更新现有对象,但要为属于现有对象的新对象发送数据。那看起来像

= form_for [@object], :as => @child_object, :url => my_optional_custom_path do |f|
    # etc...

这会生成一个向自定义 url 发送 PUT 请求的表单(@object如果没有提供自定义 url,则为更新路径。PUT 请求与参数一起发送params[:child_object]

希望这会有所帮助!

最好的,

-布赖恩

于 2013-04-06T16:38:07.607 回答
0

我认为这不可能是您尝试的方式。表单的 URL 是在before用户输入任何数据时创建的。所以您需要:idNumber从路由中删除 ..

如果你这样做,你会得到以下路线:

check        /check(.:format)    person#check

因为现在删除了正则表达式,所以您需要在您的控制器中执行此操作:

def check

  # Make sure ID is digits only
  idNumber = params[:idNumber].gsub(/[^\d]/, '')

  regCheck = RegCheck.new

  @person = regCheck.check_id(idNumber)

  if @person.name == nil
    redirect_to root_path
  end
end

你的形式没问题,但你可能想像check_pathTheBinaryhood 建议的那样使用..

如果你真的想要它,check/:idNumber你也可以将表单提交给另一个动作,并从那里重定向到正确的路径..

于 2013-04-13T12:09:24.803 回答