0

私のアプリケーションでは、params から値を受け取るコントローラーがあります。その後、この値を使用してオブジェクトを保存する必要があります(隠しフィールドを使用します)。しかし、私はそのようなエラーを受け取ります:ボタンを押しCalled id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_idたときCreate。どうすればこれを解決できますか?

コントローラ:

# encoding: UTF-8
class AttendancesController < ApplicationController
  before_filter :authenticate_teachers, :only => [ :new, :create ]

  def new
    @teacher_subjects = current_user.teacher.subjects
    @pupil = get_pupil_from_params( params )
    @attendance = Attendance.new
  end

  def create
    @teacher_subjects = current_user.teacher.subjects
    @attendance = Attendance.new( params[:attendance] )

    if @attendance.save
      redirect_to journals_path( :class_code => params[:class_code],
                                   :subject_name => params[:subject_name] )
      flash[:success] = "Success!"
    else
      flash.now[:error] = @attendance.errors.full_messages
                                      .to_sentence :last_word_connector => ", ",
                                                   :two_words_connector => ", "
      render 'new'
    end
  end

  private

    def get_pupil_from_params( params )
      pupil = Pupil.where( "id = ?", params[:p_id] ).first
    end    
end

意見

<%= form_for @attendance, :html => {:class => "form-horizontal"} do |f| %>
  <%= field_set_tag do %>
    <%= hidden_field_tag :class_code, params[:class_code] %>
    <%= hidden_field_tag :subject_name, params[:subject_name] %>
    <%= f.hidden_field :pupil_id, :value => @pupil.id %>

    <div class="control-group">
      <%= f.label :visited, "Did pupil visit lesson?", :class => "control-label" %>
      <div class="controls">
        <%= label_tag nil, nil, :class => "radio" do %>
          <%= f.radio_button :visited, true %>
          Yes
        <% end %>

        <%= label_tag nil, nil, :class => "radio" do %>
          <%= f.radio_button :visited, false %>
          No
        <% end %>
      </div>
    </div>

    <%= f.submit "Create", :class => "btn btn-large btn-success" %>
  <% end %>
<% end %>

「作成」ボタンを押した後、次のようなハッシュを取得します。

{"utf8"=>"✓",
 "authenticity_token"=>"kgNoJfivDEzqpLJYF5QK9vQS99Cq9app5ujPDC4lKKI=",
 "class_code"=>"11v",
 "subject_name"=>"Math",
 "attendance"=>{"pupil_id"=>"1"},
 "commit"=>"Create"}

私のモデル:

class Attendance < ActiveRecord::Base
  belongs_to :pupil
  belongs_to :lesson

  validates :pupil_id, :presence => { :message => "should exist" }

  validates :lesson_id, :presence => { :message => "should exist" }

  validates :visited,
              :inclusion => { :in => [true, false],
                              :message => "should be chosen"
                            }
end
4

1 に答える 1

0

出席が保存に失敗した場合は、エラーのあるフォームを再レンダリングしようとしますが、コントローラー@pupilcreateメソッドでの値を設定しないため、ビューでが呼び出されたnilときになります。@pupil.id

これはここでの問題かもしれませんがAttendance、検証があるかどうかを確認し、例外の行番号を確認する必要があることを確認する必要があります。問題がない場合は、投稿してください。

于 2012-05-20T16:19:22.270 に答える