错误ActiveRecord :: RecordNotFound(找不到没有ID的Planner):

时间:2014-02-05 07:46:41

标签: ruby-on-rails ruby activerecord rails-activerecord

我的代码有问题,我无法弄清楚它是什么。已经有一天我试图通过谷歌搜索和搜索Stack Overflow来解决这个问题。

错误:

Processing ClassTimingsController#show (for 127.0.0.1 at 2014-02-05 15:27:19) [POST]
Parameters: {"authenticity_token"=>"sRTUkx7slXEX+kmzNl4GbYSIFSyf1WGSP5fRB5+rPzY=",
"batch_id"=>"13", "_"=>"", "action"=>"show", "controller"=>"class_timings"}
[FedenaRescue] AR-Record_Not_Found Couldn't find Planner without an ID

ActiveRecord::RecordNotFound (Couldn't find Planner without an ID):
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1567:in `
find_from_ids'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:616:in `find'
app/controllers/class_timings_controller.rb:103:in `show'

我想show中的“class_timings_controller.rb”存在一些问题。

def show
  @planner = nil
  if params[:planner_id] == ''
    @class_timings = ClassTiming.find(:all, :conditions=>["planner_id is null and   is_deleted = false"])
  else
    @class_timings = ClassTiming.active_for_planner(params[:planner_id])
    @planner = Planner.find params[:planner_id] unless params[:id] == ''
  end

  respond_to do |format|
    format.js { render :action => 'show' }
  end
end

我的错误是什么?

以下是MVC的代码。

Model(class_timing.rb)

class ClassTiming < ActiveRecord::Base
  belongs_to :batch
  belongs_to :planner

  validates_presence_of :subject_title
  validates_uniqueness_of :subject_title,  :scope => [:planner_id , :batch_id, :is_deleted]

  named_scope :for_batch, lambda { |b| { :conditions => { :batch_id => b.to_i, :is_deleted=>false, :checklist => false} } }
  named_scope :default, :conditions => { :batch_id => nil, :checklist => false, :is_deleted=>false  }
  named_scope :active_for_batch, lambda { |b| { :conditions => { :batch_id => b.to_i, :is_deleted=>false} } }
  named_scope :active, :conditions => { :batch_id => nil, :is_deleted=>false  }

  named_scope :for_planner, lambda { |p| { :conditons => { :planner_id => p.to_i, :is_deleted=>false, :checklist => false} } }
  named_scope :default, :conditions => { :planner_id => nil, :checklist => false, :is_deleted=>false }
  named_scope :active_for_planner, lambda { |p| { :conditions => { :planner_id => p.to_i, :is_deleted=>false} } }
  named_scope :active, :conditions => { :planner_id => nil, :is_deleted=>false }
end

视图

索引

<div id="content-header">
  <%= image_tag("/images/show_timetable.png") %>
  <h1><%= t('teaching_schedule') %></h1>
  <h3><%= t('create_new_teaching_schedule') %></h3>
  <div id="app-back-button">
    <%= link_to_function image_tag("/images/buttons/back.png", :border => 0), "history.back()"  %>
  </div>
</div>

<div id="page-yield">

  <div id="flash_box"></div>
  <% unless flash[:notice].nil? %>
    <p class="flash-msg"> <%= flash[:notice] %> </p>
  <% end %>

  <div class="label-field-pair">
    <label ><%= t('select_a_batch') %>:</label>
    <div class="text-input-bg">
        <%= select :batch, :id,
        @batches.map {|b| [b.full_name, b.id] },
        {:prompt => "#{t('common')}"},
        {:onchange => "#{remote_function(
        :url => { :action => 'show' },
        :with => "'batch_id='+value",
        :before => "Element.show('loader')",
        :success => "Element.hide('loader')"
        )}"} %>

    <label ><%= t('select_a_module') %>:</label>
    <div class="text-input-bg">
      <%= select :planner, :id,
        @planners.map {|p| [p.name, p.id] },
        {:prompt => "#{t('common')}"},
        {:onchange => "#{remote_function(
        :url => { :action => 'show' },
        :with => "'planner_id='+value",
        :before => "Element.show('loader')",
        :success => "Element.hide('loader')"
        )}"} %>
      <%= image_tag("loader.gif", :align => "absmiddle", :border => 0, :id => "loader", :style =>"display: none;" ) %>
    </div></div></div>

  <div id="class-timings-list"><%= render :partial => "show_batch_timing" %></div>
  <div id="modal-box" style="display:none;"></div>

  <div class="extender"></div>
</div>

展示

<div class="linker">
  <%= link_to_remote "#{t('add')}", :url => { :action => 'new', :id => @planner , :id => @batch} %>
</div>

<% unless @class_timings.empty? %>
<table id="class-timings-list" width="100%">
  <tr class="tr-head">
    <td><%= t('subject_title') %></td>
    <td><%= t('page_no') %></td>
    <td><%= t('duration') %></td>
    <td><%= t('checklist') %></td>
    <td><%= t('tutor_name') %></td>
    <td><%= t('operations') %></td>
  </tr>

  <% @class_timings.each do |class_timing| %>

    <tr id="class-timing-<%= class_timing.id %>" class="tr-<%= cycle('odd','even')   %>">
      <td class="col-2"><%= class_timing.subject_title %></td>
      <td class="col-5" style="text-align:right"><%= class_timing.page_no %></td>
      <td class="col-5" style="text-align:right"><%= class_timing.duration %></td>
      <td class="col-5" style="text-align:center"><%= check_box_tag(nil, class_timing.checklist, class_timing.checklist, :disabled => true) %></td>
      <td class="col-3"><%= class_timing.tutor_name %></td>
      <td class="col-3"><small><%= link_to_remote("#{t('edit_text')}",
          :url => edit_class_timing_path(class_timing), :method => 'get' ) %> |
   <% @tt = PeriodEntry.find_all_by_id(class_timing_id ) %>
    <!--    <% @tt = PeriodEntry.find_all_by_class_timing_id(class_timing.id ) %> -->
  <% if @tt.empty? %>
    <%= link_to_remote("#{t('delete_text')}",
                :url => class_timing_path(class_timing),
                :method => 'delete',
                :confirm => "#{t('confirm_msg')}",
                :update => "class-timing-#{class_timing.id}") %>
              <% else %>
          <s><%= t('delete_text') %></s>
        <% end %></small></td>
    </tr>
  <% end %>
</table>
<% else %>
<h4><%= t('set_in_common') %></h4>
<% end %>

<label class="head_label"><%= t('create_new_teaching_schedule_for') %> <br>
  <span>
    <% if @planner.nil? and @batch.nil? %>
      <%= t('common') %>
    <% else %>
      <%=  @planner.name and @batch.full_name %>
    <% end %>
  </span></label>
<div id="ajax-create">
  <% form_remote_for :class_timing,
    :url => { :action => 'create'} do |f| %>

    <% planner_id = (@planner.nil? ? nil : @planner.id) %>
    <% batch_id = (@batch.nil? ? nil : @batch.id) %>
    <%= f.hidden_field :planner_id, :value => planner_id %>
    <%= f.hidden_field :batch_id, :value => batch_id %>
  <div id="form-errors"></div>

    <div class="label-field-pair">
      <label for="name"><%= t('subject_title') %></label>
      <div class="input-field"><%= f.text_field :subject_title %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('page_no') %></label>
      <div class="input-field"><%= f.text_field :page_no %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('duration') %></label>
      <div class="input-field"><%= f.text_field :duration %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('Completed') %></label>
      <div><%= f.check_box :checklist, :checked => false %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('tutor_name') %></label>
      <div class="input-field"><%= f.text_field :tutor_name %></div>
    </div>

<br>
<br>
<br>
    <%= f.submit "? #{t('save')}", :class => 'submit-button' %>

  <% end %>
</div>

修改

<label class="head_label"><%= t('edit_teaching_schedule_for') %> <br>
  <span>
    <% if @planner.nil? and @batch.nil? %>
      <%= t('common') %>
    <% else %>
      <%=  @planner.name and @batch.name %>
    <% end %>
  </span></label>

<div id="ajax-edit">

  <% form_remote_for @class_timing do |f| %>
    <div id="form-errors"></div>

    <div class="label-field-pair">
      <label for="name"><%= t('subject_title') %></label>
      <div class="text-input-bg"><%= f.text_field :subject_title %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('page_no') %></label>
      <div class="text-input-bg"><%= f.text_field :page_no %></div>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('duration') %></label>
      <div class="text-input-bg"><%= f.text_field :duration %></div>
    </div>

    <div class="label-field-pair">
      <% if @class_timing.checklist %>
      <label for="name"><%= t('Completed') %></label>
      <div><%= f.check_box :checklist, :checked => true %></div>
      <% else %>
      <label for="name"><%= t('Completed') %></label>
      <div><%= f.check_box :checklist, :checked => false %></div>
      <% end %>
    </div>

    <div class="label-field-pair">
      <label for="name"><%= t('tutor_name') %></label>
      <div class="input-field"><%= f.text_field :tutor_name %></div>
    </div>

<br>
<br>
<br>
    <%= submit_tag "? #{t('save')}", :class => 'submit-button' %>


  <% end %>
</div>

Controller(class_timings_controller.rb)

class ClassTimingsController < ApplicationController
  before_filter :login_required
  filter_access_to :all

  def index
    @batches = Batch.active
    @planners = Planner.active
    @class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil, :batch_id => nil, :is_deleted=>false})
  end

  def new
    @class_timing = ClassTiming.new
    @batch = Batch.find params[:id] if request.xhr? and params[:id]
    @planner = Planner.find params[:id] if request.xhr? and params[:id]
    respond_to do |format|
      format.js { render :action => 'new' }
    end
  end

  def create
    @class_timing = ClassTiming.new(params[:class_timing])
    @planner = @class_timing.planner
    @batch = @class_timing.batch
    respond_to do |format|
      if @class_timing.save
        @class_timing.planner.nil? and @class_timing.batch.nil? ?
          @class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil,:batch_id => nil,:is_deleted=>false}) :
          @class_timings = ClassTiming.for_batch(@class_timing.batch_id)
          @class_timings = ClassTiming.for_planner(@class_timing.planner_id)
        #  flash[:notice] = 'Teaching schedule was successfully created.'
        format.html { redirect_to class_timing_url(@class_timing) }
        format.js { render :action => 'create' }
      else
        @error = true
        format.html { render :action => "new" }
        format.js { render :action => 'create' }
      end
    end
  end

  def edit
    @class_timing = ClassTiming.find(params[:id])
    respond_to do |format|
      format.html { }
      format.js { render :action => 'edit' }
    end
  end

  def update
    @class_timing = ClassTiming.find params[:id]
    respond_to do |format|
      if @class_timing.update_attributes(params[:class_timing])
        @class_timing.planner.nil? and @class_timing.batch.nil? ?
          @class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil, :batch_id => nil}) :
          @class_timings = ClassTiming.for_batch(@class_timing.batch_id)
          @class_timings = ClassTiming.for_planner(@class_timing.planner_id)
        #     flash[:notice] = 'Teaching schedule updated successfully.'
        format.html { redirect_to class_timing_url(@class_timing) }
        format.js { render :action => 'update' }
      else
        @error = true
        format.html { render :action => "new" }
        format.js { render :action => 'create' }
      end
    end
  end

  def show

    @batch = nil
    if params[:batch_id] == ''
      @class_timings = ClassTiming.find(:all, :conditions=>["batch_id is null and is_deleted = false"])
    else
      @class_timings = ClassTiming.active_for_batch(params[:batch_id])
      @batch = Batch.find_by_id params[:batch_id] unless params[:batch_id] == ''
    end

    @planner = nil
    if params[:planner_id] == ''
      @class_timings = ClassTiming.find(:all, :conditions=>["planner_id is null and is_deleted = false"])
    else
      @class_timings = ClassTiming.active_for_planner(params[:planner_id])
      @planner = Planner.find_by_id params[:planner_id] unless params[:planner_id] == ''
    end

    respond_to do |format|
      format.js { render :action => 'show' }
    end
  end

  def destroy
    @class_timing = ClassTiming.find params[:id]
    @class_timing.update_attribute(:is_deleted,true)
  end

end

我提供了所有代码来帮助你弄清楚,虽然我知道一些代码与show无关。

3 个答案:

答案 0 :(得分:0)

params[:planner_id] or  params[:id]

未正确通过我猜..

使用Planner.find_by_id params[:planner_id]

答案 1 :(得分:0)

试试这个:

@planner = Planner.find params[:planner_id] if params[:id].present?

present?将处理零,空白等

答案 2 :(得分:0)

你没有将params[:planner_id]传递给你的控制器,因此它是零,而不是''。

因此,您正在调用条件else,并且您正在调用Planner.find nil

通过调用if params[:planner_id].present?来改变这种情况。