2

多くの関係でJob呼び出された別のオブジェクトに属するというオブジェクトがあります。client

これが私の仕事のモデルです

class Job < ActiveRecord::Base
  belongs_to :client
end

これが私のクライアントモデルです

class Client < ActiveRecord::Base 
  has_many :jobs
end

新しい仕事の場合、作成中にクライアントに割り当てたいだけです。

ただし、新しいジョブを作成しようとすると。私のビューに表示されるのは、名前ではなくジョブの ID だけであり、作成されたモデルの内部も空です。

ジョブを編集して再度保存しようとすると、次のエラーが表示されます。

Client(#2157214400) expected, got String(#2151988620)

Application Trace | Framework Trace | Full Trace
app/controllers/jobs_controller.rb:61:in `block in update'
app/controllers/jobs_controller.rb:60:in `update'

これは、コントローラーが何らかの形で間違っている可能性があると思いますが、これは私の最初のアプリなので、どこを見ればよいかよくわかりません。

これが私のコントローラーです。

class JobsController < ApplicationController

    def index
      @job = Job.all

      respond_to do |format|
        format.html # index.html.erb
        format.json { render json: @job }
      end
    end

    def show
      @job = Job.find(params[:id])

      respond_to do |format|
        format.html # show.html.erb
        format.json { render json: @job }
      end
    end

    def new
      @job = Job.new(params[:id])

      respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @job }
      end
    end

    def edit
      @job = Job.find(params[:id])
    end

    def create
      @job = Job.new(params[:jobs])

      respond_to do |format|
        if @job.save
          format.html { redirect_to @job, notice: 'job was successfully created.' }
          format.json { render json: @job, status: :created, location: @job }
        else
          format.html { render action: "new" }
          format.json { render json: @job.errors, status: :unprocessable_entity }
        end
      end
    end

    def update
      @job = Job.find(params[:id])

      respond_to do |format|
        if @job.update_attributes(params[:job])
          format.html { redirect_to @job, notice: 'job was successfully updated.' }
          format.json { head :no_content }
        else
          format.html { render action: "edit" }
          format.json { render json: @job.errors, status: :unprocessable_entity }
        end
      end
    end

    def destroy
      @job = Job.find(params[:id])
      @job.destroy

      respond_to do |format|
        format.html { redirect_to :jobs }
        format.json { head :no_content }
      end
    end
  end

正しい方向へのポインタまたはうなずきをいただければ幸いです。

4

1 に答える 1

0

問題は、ActiverecordがClientオブジェクトのインスタンスを予期しており、メソッドclient =を持っているためです(belogs_toアソシエーションのため)リクエストからARオブジェクトをバインドするときは、clientの代わりにclient_idパラメーターを使用する必要があります

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_toについて読むことができます

クライアント数が少ない場合は、名前としてclient_idを指定してselectを使用できます。例http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

だからあなたはそのようなことをすることができます

select("job", "client_id", Client.all.collect {|c| [ c.name, c.id ] }, {:include_blank => 'None'})

それ以外の

 f.text_field :client, :class => 'text_field' 
于 2012-05-08T19:13:00.457 に答える