Ruby on rails 3.2 第9章,练习6,Michael Hartl';s RubyonRails教程:解决方案是什么?

Ruby on rails 3.2 第9章,练习6,Michael Hartl';s RubyonRails教程:解决方案是什么?,ruby-on-rails-3.2,railstutorial.org,ruby-1.9.3,Ruby On Rails 3.2,Railstutorial.org,Ruby 1.9.3,在Michael Hartl的Ruby on Rails教程第2版第9章的练习6中说: 已登录用户没有理由在中访问新操作和创建操作 用户控制器。安排将此类用户重定向到 根URL,如果他们试图点击这些页面 如何为此编写rspec测试?我试过这个 describe "POST on Users#create" do before { post users_path } specify { response.should redirect_to(root_path) } end

在Michael Hartl的Ruby on Rails教程第2版第9章的练习6中说:

已登录用户没有理由在中访问新操作和创建操作 用户控制器。安排将此类用户重定向到 根URL,如果他们试图点击这些页面

如何为此编写rspec测试?我试过这个

  describe "POST on Users#create" do
    before { post users_path }
    specify { response.should redirect_to(root_path) }
  end
我尝试过使用do/end块,添加用户属性的散列,等等。上面的代码片段被添加到中的第162行。他们都给了我这个错误:

Failures:

  1) Authentication authorization as non-admin user POST on Users#create 
     Failure/Error: before { post users_path }
     AbstractController::DoubleRenderError:
       Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".
     # ./app/controllers/users_controller.rb:27:in `create'
     # ./spec/requests/authentication_pages_spec.rb:72:in `block (5 levels) in <top (required)>'

Finished in 2.72 seconds
88 examples, 1 failure
我知道这是有效的,因为我用手测试过。唯一的问题是我无法为它编写rspec测试


为什么我会犯这个错误?我做错了什么?解决办法是什么?谢谢。

保罗,谢谢你的提示。我解决了这个问题

我试图通过添加

admin_user if signed_in?
虽然这似乎在浏览器中起作用,但在背景中还发生了其他事情。在更仔细地观察了我的创建操作之后,这是我所做的更改,并且rspec测试开始起作用:

    diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 6e0fec8..53f8325 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -8,8 +8,8 @@ class UsersController < ApplicationController
   end

   def new
-    admin_user if signed_in?
-    @user = User.new
+    signed_in? ? admin_user : @user = User.new
+    #@user = User.new
   end

   def show
@@ -17,14 +17,17 @@ class UsersController < ApplicationController
   end

   def create
-    admin_user if signed_in?
-    @user = User.create(params[:user])
-    if @user.save
-      sign_in @user
-      flash[:success] = "Welcome to the Sample App!"
-      redirect_to @user
-    else
-      render 'new'
+    if signed_in?
+        admin_user
+      else
+      @user = User.create(params[:user])
+      if @user.save
+        sign_in @user
+        flash[:success] = "Welcome to the Sample App!"
+        redirect_to @user
+      else
+        render 'new'
+      end
     end
   end
diff--git a/app/controllers/users\u controller.rb b/app/controllers/users\u controller.rb
索引6e0fec8..53f8325 100644
---a/app/controllers/users\u controller.rb
+++b/app/controllers/users\u controller.rb
@@-8,8+8,8@@class UsersController
解决方案是将代码封装到完整的if/else块中。如果我没有这样做,代码似乎会继续,创建操作证明了这一点。这对于新操作来说并不是什么问题,因为在简单化的三元操作之后,它只分配了一个实例变量


总之,我只需要保罗给我一个很好的线索,并好好睡一觉。谢谢。

我自己刚读完教程,正在做这个练习,所以我肯定不是专家。然而,我对这个请求的理解与你不同。据我所知,如果任何登录用户尝试用户新建或创建操作,而不仅仅是非管理员,那么请求将重定向到根页面


无论如何,我见过的最优雅的解决方案是使用before_过滤器,如

中所述。您的错误是,
在该操作中多次调用了渲染和/或重定向
。您是否可以编辑您的问题,将
create
方法的内容添加到您的
userscocontroller
中。您好,Paul,谢谢您的回复。我已按要求编辑了我的帖子。但为了让你更容易,我的代码是。在这里,你应该能够看到我的用户控制器在其充分的荣耀。再次感谢您的帮助。您能够解决自己的问题真是太好了!请将此标记为已接受的答案,以供其他人参考:-)
    diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 6e0fec8..53f8325 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -8,8 +8,8 @@ class UsersController < ApplicationController
   end

   def new
-    admin_user if signed_in?
-    @user = User.new
+    signed_in? ? admin_user : @user = User.new
+    #@user = User.new
   end

   def show
@@ -17,14 +17,17 @@ class UsersController < ApplicationController
   end

   def create
-    admin_user if signed_in?
-    @user = User.create(params[:user])
-    if @user.save
-      sign_in @user
-      flash[:success] = "Welcome to the Sample App!"
-      redirect_to @user
-    else
-      render 'new'
+    if signed_in?
+        admin_user
+      else
+      @user = User.create(params[:user])
+      if @user.save
+        sign_in @user
+        flash[:success] = "Welcome to the Sample App!"
+        redirect_to @user
+      else
+        render 'new'
+      end
     end
   end