我正在构建一个具有基调模型和故事模型的应用程序(以及我用Devise实现的用户模型)。键注有很多故事,故事属于基调。
我在创建新故事时遇到了问题,我得到了以下错误:
NoMethodError in StoriesController#create
未定义方法#User:0x007fba0e32f760
错误发生在stories_controller.rb的第18行,即
@story = @current_user.keynote.stories.build(params[:story])在create方法中。
这是我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
class KeynotesController < ApplicationController
def index
@keynotes = Keynote.find :all, :order => '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"=>"✓“、”keynote_id“”=>“1”、“=>”{命名为“=>”Hi?}、“提交”=>问题“”}
这就是我的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=>“故事”}
但是数据库中的记录是在没有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发布于 2011-11-05 19:53:49
发生此错误是因为没有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,那就意味着黑客能够将一个故事与一个可能是不可缺少的主题联系起来。
我只是猜你不想让一个故事添加到一个属于其他用户的主题中。
https://stackoverflow.com/questions/8022587
复制相似问题