我正在尝试将表单的输入链接到我的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
。有人能告诉我我做错了什么吗?
答案 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
,你也可以将表单提交给另一个动作,然后从那里将其重定向到正确的路径。