Controller#action中的NoMethodError – #User的未定义方法`keynote’:0x007fba0e32f760>

我正在构建一个具有Keynote模型和Story模型的应用程序(以及我用Devise实现的用户模型)。 主题演讲有许多故事和一个故事属于主题演讲。

我在创建新故事时遇到问题,我收到以下错误:

StoriesController中的NoMethodError #create

#User的未定义方法`keynote’:0x007fba0e32f760

该错误发生在stories_controller.rb的第18行

@story = @current_user.keynote.stories.build(params[:story]) 

在create方法中。

这是我的stories_controller.rb的一部分

 class StoriesController  [: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

 class KeynotesController  'id ASC' end def new @keynote = Keynote.new end def show @keynote = Keynote.find(params[:id]) end def create @keynote = Keynote.new(params[:keynote]) if @keynote.save flash[:notice] = 'Keynote submission succeeded' redirect_to keynotes_path else render :action => 'new' end end end 

这些是传递的参数:

{“utf8”=>“✓”,“authenticity_token”=>“76odSpcfpTlnePxr + WBt36fVdiLD2z + Gnkxt / Eu1 / TU =”,“keynote_id”=>“1”,“story”=> {“name”=>“嗨?“},”commit“=>”询问“}

这就是我在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]) 。 这会引发一个不同的错误:

路由错误

没有路线匹配{:controller =>“stories”}

但是创建了数据库中的记录,但没有user_id。

任何帮助将非常感激。

更新:这是我的用户模型,user.rb

 class User  :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 

这是故事.rb模型:

 class Story  'id DESC', :limit => 3 end end protected def create_initial_vote votes.create :user => user end end 

发生错误是因为没有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]) 

这样,您就知道您总是为当前用户找到主题演讲。 如果黑客发送param keynote_id = 55 ,但55不属于current_user,则意味着黑客能够将故事与可能没有主题的主题演讲相关联。

我只是猜测你不想允许在属于其他用户的主题演讲中添加故事。