我有一个名为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
任何指针或向正确方向点头都会受到赞赏。
答案 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'