Ruby on rails 如何重定向登录用户尝试访问Ruby中的User.new和User.create?

Ruby on rails 如何重定向登录用户尝试访问Ruby中的User.new和User.create?,ruby-on-rails,railstutorial.org,Ruby On Rails,Railstutorial.org,我要学习Hartl的Rails教程中的。我已经试了很久了,但无法破解问题6: 登录用户没有理由访问用户控制器中的新建和创建操作。如果这些用户试图访问这些页面,请安排将其重定向到根URL 首先,我应该把这些测试放在哪里?目前我正在尝试user\u pages\u spec.rb,但我不确定这是否正确。那么我应该把逻辑放在哪里呢 第二,我的测试应该是这样的: describe "after signing-in" do before { sign_in(user) } descr

我要学习Hartl的Rails教程中的。我已经试了很久了,但无法破解问题6:

登录用户没有理由访问
用户
控制器中的
新建
创建
操作。如果这些用户试图访问这些页面,请安排将其重定向到根URL

首先,我应该把这些测试放在哪里?目前我正在尝试
user\u pages\u spec.rb
,但我不确定这是否正确。那么我应该把逻辑放在哪里呢

第二,我的测试应该是这样的:

  describe "after signing-in" do
    before { sign_in(user) }
    describe "creating a new user" do
      before { put new_user_path }
      specify { response.should redirect_to(root_url) }
    end
  end
在我执行上述操作时,RSpec告诉我

Expected response to be a redirect to but was a redirect to http://www.example.com/signin. 及


正常工作。感谢@Peter de Ridder的帮助

我真的不知道为什么在调用新用户路径时会有put请求

describe "after signing-in" do
  let(:user) { FactoryGirl.create(:user) }
  before { sign_in user }

 describe "creating a new user" do
   before { get new_user_path }
   specify { response.should redirect_to(root_url) }
 end
end

现在,测试应该按照预期的那样工作。您仍然需要编写代码来实际执行重定向。但是,嘿,这就是全部的挑战。我个人会检查用户是否已登录/在场。如果是,则“新建”和“创建”操作将不再可访问。

谢谢。但如图所示,
response
不接受
visit
,因为它不是
ActionDispatch::Request
。相反,我使用了
it{should\u not_selector'title',text:full\u title('Sign Up')}
来查看是否发生了重定向。此测试通过,但在浏览器中执行此操作时没有重定向。有没有关于如何诊断这种看似不匹配的想法?忽略我第一次评论中的问题。测试正在运行。是的,我会的,但如果您将
visit
更改为
get
,或者将
指定{response.should重定向到(root\u url)}
更改为
它{不应该有选择器'title',text:full\u title('Sign')}
,这可能是个好主意。我第一次写测试的时候犯了一个小错误。还有更多的帮助
 describe "creating a new user" do
   before { get new_user_path } # note the use of GET here not PUT
   specify { response.should redirect_to(root_url) }
 end
describe "after signing-in" do
  let(:user) { FactoryGirl.create(:user) }
  before { sign_in user }

 describe "creating a new user" do
   before { get new_user_path }
   specify { response.should redirect_to(root_url) }
 end
end