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'

我想这可能是因为我的控制器在某种程度上是错误的,但这是我的第一个应用程序,所以我不太确定去哪里看。

这是我的控制器。

类 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_id 参数而不是 client

你可以阅读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 回答