RailsTutorial:signup_path和user_path之间的区别是什么?

时间:2015-09-15 00:49:27

标签: ruby-on-rails ruby tdd

我在Michael Hartl的Rails教程的第7章中,我很难理解他为特定测试所要求的“_path”(确切地说是第7.3.4节)。这是有问题的代码:

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, user: { name:  "",
                           email: "user@invalid",
                           password:              "foo",
                           password_confirmation: "bar" }
    end
    assert_template 'users/new'
  end
end

特别是,我对get signup_pathpost users_path感到困惑。当我返回并搜索书籍signup_path时,表5.1表明它是[sample_app url]/signup的命名路由,它应该将访问者引导到网站的注册页面。此外,当我在书中搜索users_path时,表7.1指出它是使用“创建”控制器操作的[sample_app url]/users的命名路由,因为我们发出了POST HTTP请求。

注意:在回复中,不建议更改此代码。这是基于Hartl的Rails教程,并假设代码是正确的,并且应该按原样运行。请确保您的答案解释了我发布的代码(或其教程中的其他代码),而不是对现有代码的修改。

编辑:好的,所以我想我可以看到signup_pathusers_path之间的区别:在routes.rb文件中,/ signup路由到{{1} },这意味着它被路由到用户控制器,特别是该控制器的“新”方法。我知道这样做的结果是加载new.html.erb文件。我没有得到的部分是 - 用户#new控制器操作如何知道要加载哪个HTML页面? “新”方法是否会自动调用哪个视图也称为“新”?或...... (这是新方法的相关控制器代码:

users#new

我的问题的另一部分是users_path:def new @user = User.new end 表示/ users的POST方法是通过用户#create controller / action的路由。但是我的routes.rb文件没有反映这一点的路线:

rake routes

所以问题的第二部分是:如何知道路径文件将post users_path路由到用户#create controller / action?

2 个答案:

答案 0 :(得分:1)

不要指向同一页面,GET signup_path会将您带到用户可以注册的页面,而POST users_path是您发送在GET signup_path上生成的参数的不同路径。

此外,您不需要搜索表格以查看每个_path指向的URL,只需键入

即可
rake routes

在命令提示符下,您将看到每条路径是什么。

答案 1 :(得分:1)

这条小线

resources :users

实际上是seven different(但非常常见)路由的快捷方式,涵盖资源上的所有CRUD(创建,读取,更新和删除)操作。其中之一就是:

users_path   POST   /users  users#create    create a new user