Rails 3.2 - 尝试编辑新数据库条目时收到奇怪的错误

时间:2012-05-08 18:42:40

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

我有一个名为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&lt; 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

任何指针或向正确方向点头都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

问题是因为Activerecord期望Client对象的一个​​实例,并且它有方法client =(因为belogs_to关联) 从请求绑定AR对象时,应使用client_id参数而不是客户端

您可以阅读http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

如果客户端数量很短,您可以使用select with client_id作为名称 示例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'