Hartl的Rails教程第9章练习6

rai*_*ser 7 rspec ruby-on-rails

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

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

我不太清楚两个行为"创造"和"新"之间的差异; 有人可以这么善意地详细说明吗?

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

我尝试通过修改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
Run Code Online (Sandbox Code Playgroud)

rkr*_*rdo 10

我做了一个之前的过滤器,似乎运行良好,为测试我这样做:

在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
Run Code Online (Sandbox Code Playgroud)

就像@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
Run Code Online (Sandbox Code Playgroud)

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

  • 为了让我的工作,我必须在{sign_in user,no_capybara:true}之前传递`并传递`users_path(user)`.只是为了别人的信息! (3认同)

Dav*_*ton 1

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