0

我有几个使用 STI 设置的模型

人 < ActiveRecod .....

男人

女士

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

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

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

有什么想法或解决方法来解决这个问题吗?

控制器代码

# 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

当我调用 new 时,它将用于子类,即

<%= 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) %>

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

4

1 回答 1

2

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

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

在 form_for 中,我们需要将 id 强制为基本类型 id,否则编辑会失败

所以

<%= form_for(@person) 做 |f| %> 应该是

<%= form_for(@person.becomes(Person) do |f| %> 如果您查看 html 输出中的差异

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

于 2012-10-26T10:51:07.557 回答