2011-11-05 49 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'。 谢谢! –

相关问题