Ruby on Rails路由澄清

时间:2014-06-16 21:35:12

标签: ruby-on-rails ruby ruby-on-rails-3 simple-form

我并不是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操作处理。如果你能解释一下这是怎么回事,我会非常感激。谢谢。

3 个答案:

答案 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_pathapplied_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/applyapply_path/apply。这两个命名路径是IDENTICAL。当表单执行POST/apply时会出现差异,它会看到POST并立即转到第二条路线。同一GET路径的/apply将转到第一条路径。

在本文中,您只需要命名其中一条路线,并在任何地方使用该名称。这就是在路由文件中声明资源时的原因:

resources :users

你最终得到了一个&#34; POST / users&#34;和&#34; GET / users&#34;根据发送的请求类型分别路由到users#createusers#index的路径 - 但是您只有一个users_path命名路由,它始终返回&#34; / users&#34 ;