Вопрос по ruby-on-rails, rspec – Учебник по рельсам Хартла Глава 9 Упражнение 6

7

Обновление, отображение и удаление пользователей, упражнений

Есть ли способ создать тест Rspec для действий контроллера пользователя, например & quot; создать & quot; и "новый?"

Мне не совсем понятна разница между этими двумя действиями "создать" и & quot; новый & quot; сами по себе; Может ли кто-то быть так любезен, чтобы уточнить?

После создания теста, как мне перейти к реализации redirect_to root_path? Я думаю, что я должен включить "новый" и & quot; создать & quot; действия в разделе подписал before_filter, но это не перенаправляет автоматически в корень.

Я попытался пройти тесты, изменив файл 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

Ваш Ответ

3   ответа
0

Я также сделал фильтр до этого, но мой фильтр другой, и я не понимаю, почему он работает.

Мой пользовательский контроллер имеет следующие записи

   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 не совпадает с пользователем, когда пользователь вошел в систему и наоборот? По моему мнению, они должны быть равны в первом случае и не должны быть во втором.

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

Как говорит @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 связана сОСТАЛЬНОЕ архитектурный стиль, но в основном,new это действие от контроллера пользователя, который отвечает наGET запрос и тот, который отвечает за возвращение представления, на которое он отвечает (в данном случае, новой формы пользователя).create с другой стороны, это действие, которое реагирует наPOST запрос, он ничего не отображает (он может отвечать с помощью javascript, но это - сложная тема), и именно он отвечает за создание новых пользователей, как подразумевает название действия.

Чтобы заставить мою работать, я должен был пройтиbefore { sign_in user, no_capybara: true } и передатьusers_path(user), Просто для других Информация!
Это мне очень помогло, спасибо!
@WillJones: Спасибо. Я смотрел на это в течение 45 минут, и твой совет о no_capybara: правда спас меня.
1
  1. Yes; and this is partially begun around 7.16 and elsewhere.
  2. One actually creates a user (create). One is for the page for creating a new user (new).
  3. Not sure I understand the question.
@ user1469059 Все еще не уверен, что понимаю.
Будет ли изменение users_controller.rb, как показано выше, перенаправить вошедших в систему пользователей в корневой каталог, но в противном случае будет работать правильно? railser
@ user1469059 Might; ты пробовал это?
Пожалуйста, смотрите мой выше редактировать; надеюсь, это обеспечит некоторую ясность. Я действительно ценю твою помощь. Я не мог прокомментировать здесь раньше по какой-то причине ... railser
Да, но это не работает. Я не совсем уверен, почему. Я думаю, что моя логика верна, но синтаксис где-то должен быть неправильным. Когда я писал тест, я использовал response {define.should redirect_to (root_path)}, и он дал мне ошибку ActionDispatch. Я попытался найти его и где-то прочитать, что это связано с Капибарой. Я не совсем уверен. Есть ли какой-нибудь ресурс, где я мог бы прочитать больше о синтаксисе для Rspec и Capybara? railser

Похожие вопросы