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,则意味着黑客能够将故事与可能没有主题的主题演讲相关联。
我只是猜测你不想允许在属于其他用户的主题演讲中添加故事。