如果出现以下情况,则不会在单个表继承中调用SQL UPDATE:type field in form

时间:2012-10-24 18:03:57

标签: ruby-on-rails single-table-inheritance update-attributes

我使用STI设置了一些模型

人< ActiveRecod .....

女人

我已经指定了一个类型字段,并且创建一个新记录可以正常工作。使用记录成功保存子类型(人或女人),并且类型列中的子类型是正确的类型。

但是,当我尝试更新/编辑记录时,它从不调用SQL UPDATE。 update_attributes返回true。日志表示调用SELECT,但不调用UPDATE。

如果我从表单中删除类型字段。并创建它保存的新记录。但是type字段为null。但是我可以更新记录。

任何想法或解决方法来解决这个问题?

控制器代码

# GET /persons/new
# GET /persons/new.json
def new
   @person = current_user.persons.build(params[:person])
   @person.type = params[:type]    


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

 # GET /persons/1/edit
 def edit
   @person = Person(params[:id])
 end

# POST /persons
# POST /persons.json
def create
@person = current_user.persons.build(params[:person])

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

# PUT /persons/1
# PUT /persons/1.json
def update
@person = Person.find(params[:id])

respond_to do |format|
  if @person.update_attributes(params[:person])

    format.html { redirect_to @person, notice: 'Person was successfully updated.' }
    format.json { head :no_content }
  else

    format.html { render action: "edit" }
    format.json { render json: @person.errors, status: :unprocessable_entity }
  end
end
end

当我称之为新的时,它将是子类,即

<%= link_to "New Woman", new_woman_path %>

我为此准备了路线,即

resources :women, :controller => "persons", :type => "Woman"
resources :men, :controller => "persons", :type => "Man"

当我打电话给编辑时,我有问题,即

<%= link_to 'Edit', edit_person_path(@person) %>

请注意,如果我在控制台中创建和编辑记录。它已创建并更新好了。

1 个答案:

答案 0 :(得分:2)

好的,嵌套属性是红鲱鱼。问题在于STI

Rails表单帮助指南说你不能依赖STI的记录识别。

在form_for中我们需要将id同步为基本类型id否则编辑失败

所以

&lt;%= form_for(@person)do | f | %GT; 应该是

&lt;%= form_for(@ person.becomes(Person)do | f |%&gt; 如果你看一下html输出中的差异

问题html在编辑模式下使用.becomes时会创建像edit_woman_fieldname这样的ID,我们会得到像edit_room_fieldname这样的ID。在whihc的情况下,它保存并更新确定