我使用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) %>
请注意,如果我在控制台中创建和编辑记录。它已创建并更新好了。
答案 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的情况下,它保存并更新确定