1

users、およびの 3 つのリソースがlistsありitemsます。リンクをネストlistsusersてそれに応じて更新しましたが、rspec から 2 つのエラーが発生していますが、これは完全な謎です。ルートをネストする前に、すべてが機能しました。

私はレールの初心者なので、どんな助けでも大歓迎です!

  1) Authentication authorization for non-signed-in users in the Lists controller submitting to the destroy action 
     Failure/Error: before { delete user_list_path(user, FactoryGirl.create(:list)) }
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken
     # ./spec/requests/authentication_pages_spec.rb:84:in `block (6 levels) in <top (required)>'

  2) User pages profile page 
     Failure/Error: before { visit user_path(user) }
     ActionView::Template::Error:
       No route matches {:action=>"show", :controller=>"users", :id=>nil}
     # ./app/views/shared/_user_info.html.erb:1:in `_app_views_shared__user_info_html_erb__1836116684083464018_70145329446120'
     # ./app/views/users/show.html.erb:4:in `_app_views_users_show_html_erb___902249955135429148_70145329432180'
     # ./spec/requests/user_pages_spec.rb:12:in `block (3 levels) in <top (required)>'

ルート.rb

MyApp::Application.routes.draw do
  resources :users do
    resources :lists, only: [:show, :create, :destroy]
  end
  resources :items, only: [:show, :create, :destroy]
  resources :sessions, only: [:new, :create, :destroy]

user.rb

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password
  has_many :lists, dependent: :destroy
  has_many :items, through: :lists

list.rb

class List < ActiveRecord::Base
  attr_accessible :name
  belongs_to :user
  has_many :items, dependent: :destroy

item.rb

class Item < ActiveRecord::Base
  attr_accessible :link, :list_id, :title
  belongs_to :list

アップデート

user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:l1) { FactoryGirl.create(:list, user: user, name: "Foo") }
    let!(:l2) { FactoryGirl.create(:list, user: user, name: "Bar") }

    before { visit user_path(user) }

    it { should have_selector('h1',    text: user.name) }
    it { should have_selector('title', text: user.name) }

    describe "lists" do
      it { should have_content(l1.name) }
      it { should have_content(l2.name) }
      it { should have_content(user.lists.count) }
    end
  end

  describe "lists page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:l1) { FactoryGirl.create(:list, user: user, name: "Foo") }
    let!(:i1) { FactoryGirl.create(:item, list: l1, title: "Shirt") }

    before { visit user_list_path(user, l1) }

    it { should have_content(i1.title) }
    it { should have_content(l1.items.count) }
  end
...

更新 2

users_contoller.rb

class UsersController < ApplicationController
  before_filter :signed_in_user, only: [:edit, :update]
  before_filter :correct_user,   only: [:edit, :update]

  def show
    @user = User.find(params[:id])
    @lists = @user.lists
    @list = current_user.lists.build if signed_in?
  end

  def new
    @user = User.new
  end

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

  def edit
  end

  def update
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      sign_in @user
      redirect_to @user
    else
      render 'edit'
    end
  end

  private

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end
end
4

1 に答える 1

1

最初のエラーは、その電子メールを持つユーザーが既に作成されているため、作成しているユーザーが無効であることを示しています。(電子メールの一意性検証の失敗) ユーザー ファクトリを変更して電子メールを順序付けし、すべてのレコードが次のように一意になるようにすることで、これを回避できます。

sequence(:email) { |n| "User#{n}@example.com"}

2 番目のテストは、まったく同じ理由で失敗します。ユーザー レコードが nil であるため、基本的にデータベースから存在しないレコードを取得しようとしています。次の行でそれを伝えています:

No route matches {:action=>"show", :controller=>"users", :id=>nil}

user = nil にすることで、show アクションで次のことが起こります。

your implementation will look something like this:
#####
@user = User.find(params[:id])
#####

params[:id] = nil なので、次のようになります。

User.find(nil)

ID が nil のユーザー レコードがないため、これは失敗します。残りの実装は問題ないはずです。

于 2012-12-22T22:14:35.040 に答える