accepts_nested_attributes_for で編集時にダブって登録される

Date 2015-11-15 9:21:52 | Topic: ruby on rails

rails version 4.xx
モデルには librarie と doc があり、それぞれ(抜粋)
class Library < ActiveRecord::Base
accepts_nested_attributes_for :docs, allow_destroy: true
class Doc < ActiveRecord::Base
belongs_to :library
となっています。
この時、libraries_controllers.rbのeditはdefaultのままで、edit.html.erbから飛ぶ_form.html.erb(抜粋)
<%= nested_form_for @library, :html => { :class => "form-horizontal library" } do |f| %><font color=#006400 ->
 ---------- 省略
    <table class="table table-striped">
      <thead>
        <tr>
          <th><%= model_class.human_attribute_name(:ファイル名  **編集の場合ファイル名とバージョンは変更不可**) %></th>
          <th><%= model_class.human_attribute_name(:バージョン) %></th>
          <th><%= model_class.human_attribute_name(:備考) %></th>
        </tr>
      </thead>
      <%= f.fields_for :docs do |df| %>
      <tr class="nested-fields">
        <td><%= f.text_field :file_name, :readonly => true, :size => 56 %></td>
        <td><%= f.text_field :version, :readonly => true, :size => 8 %></td>
        <td><%= f.text_area :remarks, :size => "30x1" %></td>
      </tr>
      <% end %>  
      <td></td><td><%= f.submit '保存', class: 'btn btn-primary' %></td>
    </table>
<% end %>
となっています。この状態でupdateすると、
データーベースに2重に登録され、もちろんshowにも二つづつ表示され、さらに悪いことに片方を削除するとデーターベースはつじつまが合うのですが、ここには記入してありませんが、Doc(色々なファイル)をWEBに保存してあり、それが削除され、残っているDocをクリックしてもファイルが無いのでエラーになります
あちゃちゃ、これは大変だー。何でだ!!........ そうかIDが無いので二重に登録されるのか、だったらIDも渡せばいいのだー。これは簡単、libraries_controllers.rbのストロング・パラメーターに登録しよう。
class LibrariesController < ApplicationController
  ---------- 省略
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_library
      @library = Library.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def library_params
      params.require(:library).permit(:prod, :model, :serial_no, :seizo_nen, :company, :branch, :section,
       :incharge, :nonyu_bi, :remarks, :pictures,
             :docs_attributes => [:id, :file_name, :version, :remarks, :_destroy],
             :pictures_attributes => [:images, :_destroy]) ←これは他のモデルの分
    end
end
これでめでたし、めでたし
だけど、セキュリティー的にはどうなのかなー?IDを受け付けると言うことは改竄の危険があるのかな??詳しい方教えて下さい。お問い合わせから連絡出来ます。


This article comes from 錦稜会 KINRYOKAI
https://www.kinryokai.net

The URL for this story is:
https://www.kinryokai.net/article.php?storyid=270