我并不是Ruby on Rails的新手,但它不是我最熟练的框架,所以我希望有人可以帮助我解决一些我试图理解的代码。
控制器:
def new
@biz = Business.new
end
def apply
@biz = Business.new(business_params)
token = SecureRandom.hex(4)
@biz.verify_token = token
if @biz.save
message = @biz.sentMessages.new
message.send_verify_email
redirect_to waiting_verification_path
else
render 'new'
end
end
路线:
get 'apply', to: 'businesses#new', as: 'apply'
post 'apply', to: 'businesses#apply', as: 'applied'
视图:
= simple_form_for @biz, url: apply_path, html: {autocomplete: "off"} do |f|
我理解路由的第一行将/apply
处的请求定向到控制器中的new
操作,该操作会创建一个新的业务对象并呈现new
视图,即我包含了一个片段。此代码段包含表单操作,该操作将成功提交到apply_path
。
我的理解表明这个apply_path
是第一条路线的命名助手,我相信它应该被引导到第二条线,其助手将是applied_path
,然后由控制器上的apply
操作。
真正让我困惑的是这个功能有效。因此,提交实际上被路由到第二条路线,并由控制器中的apply
操作处理。如果你能解释一下这是怎么回事,我会非常感激。谢谢。
答案 0 :(得分:1)
该行
= simple_form_for @bix, url: apply_path
生成类似
的内容<form action="/apply" method="post">
..
</form>
POST是表单上的默认方法,因此当表单为POST-ed
时,Rails会查看routes.rb文件并在此行上看到匹配。
post 'apply', to: 'businesses#apply', as: 'applied'
但是,如果你这样做了
= simple_form_for @bix, url: apply_path, method: :get
表单是通过GET
提交的,然后Rails会在routes.rb的第一行找到匹配项。
get 'apply', to: 'businesses#new', as: 'apply'
routes_helpers的名称并不重要,重要的是生成的url。我希望能够解决问题,如果没有,只需要求进一步澄清。
答案 1 :(得分:0)
生成的表单看起来像
<form action="/apply" method="post" autocomplete="off" class="simple_form new_business">
请注意method
属性:由于@biz
是一条新记录,因此SimpleForm知道这应该是HTTP POST并且指定为url
(AFAIK持久记录仍会创建一个表单上显示method="post"
,但插入了name="_method"
和value="put"
的其他隐藏字段。
由于路由助手apply_path
和applied_path
都只生成字符串'/apply'
,因此您在表单中定义的URL无关紧要。这应该同样有效:
= simple_form_for @biz, url: applied_path, html: {autocomplete: "off"} do |f|
当您提交表单时,您的浏览器会创建一个HTTP请求,如下所示:
POST /apply HTTP/1.1
<header information>
<post body>
和Journey(Rails路由器模块)将获取POST
+ /apply
信息以查找到businesses#apply
的路由。
为了使路线定义更简洁,您可以将其重写为
scope as: :apply do
get '/apply', to: 'businesses#new'
post '/apply', to: 'businesses#apply'
end
答案 2 :(得分:0)
这是有效的原因是你有两个命名路由映射到同一路径。 applied_path
为/apply
,apply_path
为/apply
。这两个命名路径是IDENTICAL。当表单执行POST
到/apply
时会出现差异,它会看到POST
并立即转到第二条路线。同一GET
路径的/apply
将转到第一条路径。
在本文中,您只需要命名其中一条路线,并在任何地方使用该名称。这就是在路由文件中声明资源时的原因:
resources :users
你最终得到了一个&#34; POST / users&#34;和&#34; GET / users&#34;根据发送的请求类型分别路由到users#create
和users#index
的路径 - 但是您只有一个users_path
命名路由,它始终返回&#34; / users&#34 ;