【问题标题】:Hartl's Rails Tutorial Chapter 9 Exercise 6Hartl 的 Rails 教程第 9 章练习 6
【发布时间】:2012-06-20 11:36:28
【问题描述】:

Updating, showing, and deleting users, exercises

有没有办法为“创建”和“新建”等用户控制器操作创建 Rspec 测试?

我也不太清楚“创建”和“新建”这两个动作之间的区别;有人能详细说明一下吗?

创建测试后,我将如何实施 redirect_to root_path?我想我应该在 before_filter signed_in 部分中包含“新建”和“创建”操作,但这不会自动重定向到根目录。

我试图通过如下修改 users_controller.rb 文件来通过测试:

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

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    我为此做了一个之前的过滤器,似乎效果很好, 我做了这个测试:

    关于 authentication_pages_spec.rb

    describe "signin" do
      describe "authorization" do
        describe "for signed in users" do
          let(:user) { FactoryGirl.create(:user) }
          let(:new_user) { FactoryGirl.attributes_for(:user) }
          before { sign_in user }
    
          describe "using a 'new' action" do
            before { get new_user_path }
            specify { response.should redirect_to(root_path) }
          end
    
          describe "using a 'create' action" do
            before { post users_path new_user }
            specify { response.should redirect_to(root_path) }
          end         
        end
      end
    end
    

    就像@WillJones 说的那样,有些人可能不得不在前面的块中添加no_capybara: true

    在我的用户控制器上:

    before_filter :signed_in_user_filter, only: [:new, :create]
    
    def signed_in_user_filter
      redirect_to root_path, notice: "Already logged in" if signed_in?
    end
    

    对于 new 和 create 动作之间的区别,它与 REST 架构风格有关,但基本上,new 是来自用户控制器的动作,它响应 GET 请求并且是负责返回它响应的视图(在这种情况下,一个新的用户表单)。另一方面,create 是一个响应 POST 请求的操作,它不呈现任何内容(它可以使用 javascript 响应,但这是一个高级主题)并且它负责创建新用户,例如动作名称暗示。

    【讨论】:

    • 为了让我的工作,我必须通过 before { sign_in user, no_capybara: true } 并通过 users_path(user)。仅供参考!
    • @WillJones:谢谢。我盯着它看了 45 分钟,你在 no_capybara 上的提示:真的救了我。
    【解决方案2】:
    1. 是的;这部分开始于7.16 和其他地方。
    2. 实际上创建了一个用户 (create)。一个是为页面用于创建一个新用户 (new)。
    3. 不确定我是否理解问题。

    【讨论】:

    • 请看我上面的编辑;希望它会提供一些清晰度。我真的很感谢你的帮助。由于某种原因,我之前无法在这里发表评论...
    • @user1469059 仍然不确定我是否理解。
    • 如上所示修改 users_controller.rb 是否会将已登录的用户重定向到根路径,否则可以正常工作?
    • @user1469059 可能;你试过了吗?
    • 是的,但它不起作用。我不太清楚为什么。我认为我的逻辑是正确的,但是某些地方的语法一定是错误的。当我编写测试时,我使用的是响应 {指定.should redirect_to(root_path)},它给了我一个 ActionDispatch 错误。我试着查了一下,并在某个地方读到这与水豚有关。我不太确定。是否有一些资源可以让我了解更多关于 Rspec 和 Capybara 的语法?
    【解决方案3】:

    我也为此做了一个前置过滤器,但我的过滤器不同,我不明白它为什么起作用。

    我的用户控制器有以下条目

       class UsersController < ApplicationController
    .
    .
      before_filter :logged_in_user, only: [:new, :create]
    .
    .
    def logged_in_user
          redirect_to(root_path) if !current_user?(@user)
      end
    

    它和 rkrdo 的示例一样工作得很好,并且相应的测试通过了。但这是否意味着 current_user 与用户登录时的用户不同,反之亦然?在我看来,它们在第一种情况下应该相等,而在第二种情况下不应该。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      相关资源
      最近更新 更多