我在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_path
和post users_path
感到困惑。当我返回并搜索书籍signup_path
时,表5.1表明它是[sample_app url]/signup
的命名路由,它应该将访问者引导到网站的注册页面。此外,当我在书中搜索users_path
时,表7.1指出它是使用“创建”控制器操作的[sample_app url]/users
的命名路由,因为我们发出了POST
HTTP请求。
注意:在回复中,请不建议更改此代码。这是基于Hartl的Rails教程,并假设代码是正确的,并且应该按原样运行。请确保您的答案解释了我发布的代码(或其教程中的其他代码),而不是对现有代码的修改。
编辑:好的,所以我想我可以看到signup_path
和users_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?
答案 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