首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoMethodError in Controller#action -用于#<User:0x007fba0e32f760>的未定义方法“基调”

NoMethodError in Controller#action -用于#<User:0x007fba0e32f760>的未定义方法“基调”
EN

Stack Overflow用户
提问于 2011-11-05 19:13:00
回答 1查看 4.2K关注 0票数 2

我正在构建一个具有基调模型和故事模型的应用程序(以及我用Devise实现的用户模型)。键注有很多故事,故事属于基调。

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

NoMethodError in StoriesController#create

未定义方法#User:0x007fba0e32f760

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

代码语言:javascript
复制
@story = @current_user.keynote.stories.build(params[:story])

在create方法中。

这是我stories_controller.rb的一部分

代码语言:javascript
复制
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

代码语言:javascript
复制
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文件中的内容:

代码语言:javascript
复制
  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

代码语言:javascript
复制
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模型:

代码语言:javascript
复制
class Keynote < ActiveRecord::Base
  validates_presence_of :title, :description, :speaker, :location
  has_many :stories
  belongs_to :user
end

下面是story.rb模型:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-05 19:53:49

发生此错误是因为没有keynote,而是keynotes。如果您只想向用户添加一个故事,请删除keynote.

代码语言:javascript
复制
#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

你还应该能够:

代码语言:javascript
复制
#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])

因为基调已经属于某个用户了。你应该始终对你的协会进行调整。所以,代替这个:

代码语言:javascript
复制
 @keynote = Keynote.find(params[:keynote_id])

做:

代码语言:javascript
复制
 @keynote = @current_user.keynotes.find(params[:keynote_id])

这样,您就知道您总是为当前用户找到主题。如果黑客发送param keynote_id = 55,但55不属于current_user,那就意味着黑客能够将一个故事与一个可能是不可缺少的主题联系起来。

我只是猜你不想让一个故事添加到一个属于其他用户的主题中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8022587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档