我在更新方面遇到了麻烦。当我提交表单时,参数会给我一个像{"1"=>"1", "4"=>"1"}
这样的值的哈希值。我只想更新值。因此,我将键和值keys, values = @period.map { |k,v| [k.to_i, v.to_i] }.transpose
分隔为@period = {"1"=>"1", "4"=>"1"}
。我得到像[1,4]
这样的值。那么,我如何通过这个数组更新它。当我使用update_attributes时只有最后一个值(4)。如何通过数组更新字段。我是铁路新手,所以保持冷静。
答案 0 :(得分:0)
您对此解决方案的处理方法并不遵循Rails约定,这就是您难以找到的原因。以Rails方式做事会让你的生活更轻松。
TLDR :您应该使用嵌套属性并围绕父对象@institution构建表单。请参阅Rails指南的这一部分,了解如何实现此目的:http://guides.rubyonrails.org/form_helpers.html#building-complex-forms
更详细......
您似乎有一个Period模型,一个Subject模型和一个Institution模型。期间似乎属于主题,也可能属于机构。如果我错了,请纠正我。
您似乎在以下方面打破了Rails约定:
当您使用编辑方法和视图时,您正在使用show方法和视图。
您可以在使用form_for时使用form_tag。
您正在直接从视图中调用模型。
您在处理父级的多个子记录时未使用嵌套属性。
总之,您应该改变您的方法来执行以下操作:
使INSTIT_controller#update方法负责批量更新期间数据。
将此添加到您的机构模型:
accepts_nested_attributes_for :periods
在您的institutions_controller中,将句点中的参数添加到机构的参数中,例如:
params.require(:institution).permit(
:name,
# whatever else is there now...
periods_attributes: [
:id,
:subject_id,
:institution_id
]
)
更新您的机构/ _form,看起来像这样:
<%= form_for @institution do |f| %>
<%= f.text_field :name %>
<%= fields_for :periods do |p| %>
<%= p.hidden_field :institution_id %>
<%= p.collection_select :subject_id, @subjects, :id, :name, prompt: true %>
<% end %>
<%= f.submit %>
<% end %>
看看它有多优雅?每个属性都被正确命名,并且在提交时检查传入参数时无需猜测键和值的含义。
更新您的institutions_controller#edit方法,执行以下操作:
def edit
@institution = Institution.includes(:periods).find(params[:id])
@subjects = @institution.subjects.all # assumes subjects belong to institution
end
您的institutions_controller#update可能不需要任何更新,看起来应该是这样的:
def update
@institution = Institution.find(params[:id])
if @institution.update_attributes(institution_params)
flash[:success] = "Saved!"
redirect_to @institution # or wherever you want to go
else
@subjects = @institution.subjects.all
render :edit
end
end
试一试。 HTH