2011-11-05 35 views
2

我正在構建一個具有Keynote模型和Story模型(以及用Devise實現的User模型)的應用程序。主題演講有很多故事和故事屬於主題演講。控制器中的NoMethodError#action - 未定義的方法`keynote'爲#<用戶:0x007fba0e32f760>

我在創造新的故事的問題,我得到以下錯誤:

NoMethodError in StoriesController#create

undefined method `keynote' for #User:0x007fba0e32f760

上stories_controller.rb的第18行是

@story = @current_user.keynote.stories.build(params[:story]) 
在創建方法

發生的錯誤。

這是我stories_controller.rb的一部分

class StoriesController < ApplicationController 

    before_filter :authenticate_user!, :except => [:show, :index] 

    def index 
    @keynote = Keynote.find(params[:keynote_id]) 
    @stories = @keynote.stories 
    end 

    def new 
    @keynote = Keynote.find(params[:keynote_id]) 
    @story = @keynote.stories.build 
    end 

    def create 
    if user_signed_in? 
     @keynote = Keynote.find(params[:keynote_id]) 
     @story = @current_user.keynote.stories.build(params[:story]) 
     if @story.save 
     flash[:notice] = 'Question submission succeeded' 
     redirect_to keynote_stories_path 
     else 
     render :action => 'new' 
     end 
    end 
    end 

這是我keynotes_controller.rb

這些參數傳遞:

{"utf8"=>"✓", "authenticity_token"=>"76odSpcfpTlnePxr+WBt36fVdiLD2z+Gnkxt/Eu1/TU=", "keynote_id"=>"1", "story"=>{"name"=>"Hi?"}, "commit"=>"Ask"}

這是什麼我在我的routes.rb文件中有:

get "keynotes/index" 
    get "users/show" 
    devise_for :users 
    get "votes/create" 
    get "stories/index" 

    resources :keynotes do 
    resources :stories 
    end 

    resources :stories do 
    get 'bin', :on => :collection 
    resources :votes 
    end 

    resources :users 

    root :to => 'keynotes#index' 

我刪除了current_user從錯誤的行,只剩下@story = @keynote.stories.build(params[:story])。這會引發不同的錯誤:

Routing Error

No route matches {:controller=>"stories"}

但在數據庫中的記錄被創建,而不USER_ID雖然。

任何幫助將非常感激。

更新:這是我的用戶模型,user.rb

class User < ActiveRecord::Base 

    has_many :stories 
    has_many :keynotes 
    has_many :votes 
    has_many :stories_voted_on, :through => :votes, :source => :story 

    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
end 

這裏的keynote.rb型號:

class Keynote < ActiveRecord::Base 
    validates_presence_of :title, :description, :speaker, :location 
    has_many :stories 
    belongs_to :user 
end 

而這裏的story.rb型號:

class Story < ActiveRecord::Base 
    after_create :create_initial_vote 
    validates_presence_of :name 
    belongs_to :user 
    belongs_to :keynote 

    has_many :votes do 
    def latest 
     find :all, :order => 'id DESC', :limit => 3 
    end 
    end 

    protected 
    def create_initial_vote 
    votes.create :user => user 
    end 
end 
+0

你的用戶模型定義在哪裏?這是問題的第一部分;它不認爲有一個「基調」關係/方法。 –

+0

@DaveNewton我剛剛添加了上面的用戶模型定義,以及基調和故事模型。 –

+0

好吧,沒有'keynote'方法,就像錯誤說的那樣 - 關係是'keynotes',因爲它是'has_many'。我認爲*你想要做的是通過傳遞給'create'方法的ID找到用戶的基調? –

回答

3

發生此錯誤的原因是沒有keynote,但是keynotes。如果你只是想一個故事添加到用戶,刪除keynote.

#return keynote even if it does not belong to current user 
@keynote = Keynote.find(params[:keynote_id]) 
@story = @current_user.stories.build(params[:story]) #removed `keynote.` part 
@story.keynote = @keynote #add the keynote to @story before saving @story 

你也應該能夠做到:

#return the keynote id only if it belongs to current user 
@keynote = @current_user.keynotes.find(params[:keynote_id]) 
@story = @keynote.stories.build(params[:story]) 

由於基調已經屬於某個用戶。您應該始終確定您的 關聯的範圍。所以,與其這樣:

@keynote = Keynote.find(params[:keynote_id]) 

做:

@keynote = @current_user.keynotes.find(params[:keynote_id]) 

這樣,你知道,你總是尋找當前用戶的基調。如果黑客發送參數keynote_id = 55,但55不屬於current_user,那意味着黑客能夠將故事與可能未發佈的主題相關聯。

我只是猜測你不想讓一個故事添加到屬於某個其他用戶的主題中。

+0

我在第一個模塊中做了你所說的(#return keynote,即使它不屬於當前用戶),並且在數據庫中正確創建了記錄,但我得到了一個路由錯誤:'沒有路由匹配{:controller = > 「故事」}'。我在routes.rb文件中丟失了什麼? 在應用程序中,任何用戶都可以將故事添加到任何Keynote中,這就是爲什麼我遵循第一種方法。 –

+0

很好地檢查你的重定向根 – Uchenna

+0

@UchennaOkafor我剛剛做到了,那就是問題所在。我不得不在storyController中重定向到'keynote_stories_path(@keynote)'而不是'keynote_stories_path'。 謝謝! –

相關問題