Hartl的Rails教程第9章练习6

更新,显示和删除用户,练习

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

我不太清楚两个行为“创造”和“新”之间的差异; 请问有人可以这么善意吗?

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

我尝试通过修改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 

  1. 是; 这部分是在7.16和其他地方开始的。
  2. 一个实际上创建了一个用户( create )。 一个用于创建新用户的页面( new )。
  3. 我不确定我理解这个问题。

我做了一个前filter,似乎运行良好,为测试我这样做:

在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响应,但这是一个高级主题)而且它是负责创建新用户的动作,就像动作的名字所暗示的那样。

我也做了一个前filter,但我的filter是不同的,我不明白为什么它的工作原理。

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

  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与用户不同,反之亦然? 在我看来,他们在第一种情况下应该是平等的,不应该在第二种情况下。