ActiveRecord :: RecordNotFound - 找不到没有ID的Keynote

时间:2011-11-05 13:58:56

标签: ruby-on-rails ruby-on-rails-3 controller

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

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

  

StoriesController中的ActiveRecord :: RecordNotFound #create

     

找不到没有ID的Keynote

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

@keynote = Keynote.find(params[:keynote_id])

在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 = @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

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”=&gt; “中✓”,   “authenticity_token”=&gt; “中76odSpcfpTlnePxr + WBt36fVdiLD2z + Gnkxt / EU1 / TU =”,   “故事”=&GT; { “名称”=&gt; “中作为”},   “提交”=&gt; “中发送”}

看起来没有传递Keynote的ID。

这是StoriesController#new

的视图
<%= 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'

1 个答案:

答案 0 :(得分: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设置来测试它。