Rails自定义操作的表单

时间:2013-04-04 04:27:29

标签: ruby-on-rails forms

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

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

Rake路线确实给了我以下内容:

   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=✓&idNumber=1234。有人能告诉我我做错了什么吗?

3 个答案:

答案 0 :(得分:4)

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

表格应该如下所示。

<%= form_tag(check_path) do %>
  <%= text_field_tag(:idNumber) %>
<% end %>

答案 1 :(得分:1)

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

这一行
= form_for [@object]

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

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

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

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

希望这有帮助!

最佳,

-Brian

答案 2 :(得分:0)

我认为您尝试的方式不可能..表单的网址已创建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

你的形式是好的,但你可能想要像TheBinaryhood所暗示的那样使用check_path ..

如果你真的希望它是check/:idNumber,你也可以将表单提交给另一个动作,然后从那里将其重定向到正确的路径。