2011-11-05 105 views
1

我正在构建具有Keynote模型和Story模型(以及用Devise实现的User模型)的应用程序。 主题演讲有许多故事和故事属于主题演讲。ActiveRecord :: RecordNotFound - 无法找到没有ID的Keynote

我在创造新的故事的问题,我得到以下错误:

ActiveRecord::RecordNotFound in StoriesController#create

Couldn't find Keynote without an ID

上stories_controller.rb的第17行是

@keynote = Keynote.find(params[:keynote_id]) 
在创建方法

发生的错误。

这是我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 = @keynote.current_user.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=", "story"=>{"name"=>"as"}, "commit"=>"Send"}

它看起来没有通过Keynote的ID。

这是StoriesController#新的观点

<%= error_messages_for 'story' %> 

<%= form_for @story do |f| %> 
    <p> 
     Question:<br /> 
     <%= f.text_field :name %> 
    </p> 
    <p> 
     <%= submit_tag "Ask" %> 
    </p> 
<% end %> 

这是我在我的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' 
+0

'params [:keynote_id]'可能是'nil'或在数据库中不存在。试着放一个'puts params [:keynote_id]'来看看你是否正确地得到了这个参数。检查ID是否存在于数据库表中。另外,你还没有在'StoriesController#new'中得到错误吗? – Zabba

+0

@Zabba的权利,它看起来像零,但我不知道如何填充它...(见上面的帖子的编辑)。另外,我应该在哪里放置'puts params [:keynote_id]'? –

+0

在'StoriesController#view'的视图中显示'form_for'或'form_tag'。 – Zabba

回答

1

我想这应该做的伎俩:

<%= form_for @story do |f| %> 
    <%= hidden_field_tag 'keynote_id', @keynote.id %> 
    . 
    rest of the form stuff here 
    . 
<% end %> 

PS。不知道你是否会得到keynote_idparams[:keynote_id]params[:story][:keynote_id] ..检查两者。

注:我认为使用fields_for或类似的方法也会有更简单的方法,但我目前无法访问Rails安装程序来测试。

+0

谢谢!这解决了该线上的错误,但随后在下一个失败时出现以下错误: StoriesController中的NoMethodError#create 未定义的方法'keynote'for#。 如果我删除'keynote'就会抛出这个错误,但是Story实际上是被创建的,但是没有keynote_id:'没有路由匹配{:controller =>“stories”}' 这看起来像一个路由错误。我错过了什么?我发布了上面的路线文件。 –

+0

添加它作为一个单独的问题:)在所以,当答案可以帮助你时,通过点击旁边的标记来接受答案是自定义的。也可以通过投票答案来表示赞赏。请参阅[这里的一些信息](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)! – Zabba

+0

谢谢你,刚接受你的回答,但我不能投票,因为我没有足够的声望。我会在几分钟内添加其他问题。 –

相关问题