2012-12-22 43 views
1

我有三個資源 - userslistsitems。我只是在users下嵌套lists,並相應地更新了我的鏈接,但是我從rspec中得到了兩個錯誤,這對我來說是一個完整的謎題。一切工作之前,我嵌套的路線。嵌套路線和無路線匹配

我是一個總的新手導軌和任何幫助,因此非常感謝!

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)>' 

的routes.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 

UPDATE

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 

回答

1

你的第一個錯誤是告訴你用戶您創建的文件無效,因爲具有該電子郵件的用戶已經創建。 (失敗的電子郵件獨特的驗證)可以解決這個問題,通過改變用戶的工廠進行排序的電子郵件讓每一個記錄是像這樣獨特:此完全相同的原因

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

第二個測試失敗。由於你的用戶記錄是零,你基本上試圖從數據庫中獲取一個不存在的記錄。這是告訴你在該行:

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

通過讓用戶=零,下面是你的表演動作發生:

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

因爲PARAMS [:ID =零,你會得到

User.find(nil) 

由於沒有id爲nil的用戶記錄,哪個會失敗。其餘的實現應該沒問題。

+0

謝謝 - 它對第一個錯誤非常有用!但是,第二個錯誤仍然顯示? –

+0

第二個測試失敗,因爲您沒有用戶。你能重現你的測試代碼,以便我可以看看發生了什麼問題嗎? – tomciopp

+0

查看更新 - 謝謝! –