通过数组更新

时间:2016-04-16 10:24:52

标签: ruby-on-rails arrays

我在更新方面遇到了麻烦。当我提交表单时,参数会给我一个像{"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)。如何通过数组更新字段。我是铁路新手,所以保持冷静。

1 个答案:

答案 0 :(得分:0)

您对此解决方案的处理方法并不遵循Rails约定,这就是您难以找到的原因。以Rails方式做事会让你的生活更轻松。

TLDR :您应该使用嵌套属性并围绕父对象@institution构建表单。请参阅Rails指南的这一部分,了解如何实现此目的:http://guides.rubyonrails.org/form_helpers.html#building-complex-forms

更详细......

您似乎有一个Period模型,一个Subject模型和一个Institution模型。期间似乎属于主题,也可能属于机构。如果我错了,请纠正我。

您似乎在以下方面打破了Rails约定:

  1. 当您使用编辑方法和视图时,您正在使用show方法和视图。

  2. 您可以在使用form_for时使用form_tag。

  3. 您正在直接从视图中调用模型。

  4. 您在处理父级的多个子记录时未使用嵌套属性。

  5. 总之,您应该改变您的方法来执行以下操作:

    1. 使INSTIT_controller#update方法负责批量更新期间数据。

    2. 将此添加到您的机构模型:

      accepts_nested_attributes_for :periods
      
    3. 在您的institutions_controller中,将句点中的参数添加到机构的参数中,例如:

      params.require(:institution).permit(
          :name,
          # whatever else is there now...
          periods_attributes: [
              :id,
              :subject_id,
              :institution_id
         ]
      )
      
    4. 更新您的机构/ _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 %>
      

      看看它有多优雅?每个属性都被正确命名,并且在提交时检查传入参数时无需猜测键和值的含义。

    5. 更新您的institutions_controller#edit方法,执行以下操作:

      def edit
        @institution = Institution.includes(:periods).find(params[:id])
        @subjects = @institution.subjects.all # assumes subjects belong to institution
      end
      
    6. 您的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
      
    7. 试一试。 HTH