スポンサーリンク

Rails5で複数のデータを一括変更(2)

以下の続き

Rails4で複数のデータを一括変更(1)

 

(4)config/routes.rb をさらに変更。

[sourcecode language='bash'  padlinenumbers='true']
  match '/ramen/all/edit' => 'ramen#edit_all', as: 'edit_all_raman', :via => :get
  match '/ramen/all' => 'ramen#update_all', as: 'update_all', :via => :put
  resources :ramen
[/sourcecode]
match '/ramen/all/edit' => 'ramen#edit_all', as: 'edit_all_raman', :via => :get
match '/ramen/all' => 'ramen#update_all', as: 'update_all', :via => :put
resources :ramen

 

と変更した。

image

rails s -b 0.0.0.0 してから、ブラウザで、http://localhost:3000/rails/info/routes を開くと、以下のような表示。

image

(5)app/controllers/ramen_controller.rb に以下を追加。

[sourcecode language='bash' ]
  #GET /ramen/all/edit
  def edit_all
    @ramen = Raman.all
  end

  #PUT /ramen/all
  def update_all
    params.permit!
    params['raman'].keys.each do |id|
      @raman = Raman.find(id.to_i)
      @raman.update_attributes(params['raman'][id])
   end
   redirect_to(ramen_url)
  end
[/sourcecode]
#GET /ramen/all/edit
def edit_all
  @ramen = Raman.all
end

#PUT /ramen/all
def update_all
  params.permit!
  params['raman'].keys.each do |id|
    @raman = Raman.find(id.to_i)
    @raman.update_attributes(params['raman'][id])
 end
 redirect_to(ramen_url)
end

エディタ(今回はAtom)では以下のようになる。

image

この params.permit! は、strong parameterによるエラー対策であるが、これではセキュリティ的に終わっているので、どうしても改善しなければならないところ。それはまた後日の課題として、、、(爆)

(6)app/views/ramen/ フォルダに、edit_all.html.erb を作成し、以下のように記載して保存。

[sourcecode language='ruby' ]
<h1>Editing Raman</h1>

<%= form_for :raman, :url => update_all_path, :html => { :method => :put } do %>
  <table>
    <tr>
      <th>name</th>
      <th>price</th>
    </tr>
    <% @ramen.each do |raman| %>
      <%= fields_for "raman[]", raman do |raman_fields| %>
    <tr>
      <td><%= raman_fields.text_field :name %></td>
      <td><%= raman_fields.text_field :price %></td>
    </tr>
      <% end %>
    <% end %>
  </table>

  <div class="actions">
    <%= submit_tag %>
  </div>
<% end %>
[/sourcecode]
<h1>Editing Raman</h1>

<%= form_for :raman, :url => update_all_path, :html => { :method => :put } do %>
  <table>
    <tr>
      <th>name</th>
      <th>price</th>
    </tr>
    <% @ramen.each do |raman| %>
      <%= fields_for "raman[]", raman do |raman_fields| %>
    <tr>
      <td><%= raman_fields.text_field :name %></td>
      <td><%= raman_fields.text_field :price %></td>
    </tr>
      <% end %>
    <% end %>
  </table>

  <div class="actions">
    <%= submit_tag %>
  </div>
<% end %>

エディタ(今回はAtom)では以下のようになる。

image

(7)app/views/ramen/index.html.erb の最後の行に、以下を加える。

[sourcecode language='ruby' ]
<%= link_to 'Edit All Ramen', edit_all_raman_path %>
[/sourcecode]
<%= link_to 'Edit All Ramen', edit_all_raman_path %>

エディタ(今回はAtom)では以下のようになる。

image

(8)rails s -b 0.0.0.0 してから、ブラウザで、localhost:3000/ramen を開く。

image

New Raman で、上記3つの情報を追加してから、Edit All Ramen をクリック

image

image

image

無事、一括変更できるようにはなった、、、が、、、

(問題点1)ramen_controller.rb の、def update_all で、params.permit! がセキュリティ的にやばい

(問題点2)本当は、update_all ではなく、特定の条件(特定の日付や、さらに特定の条件絞り込み(号室))で、上記のようにEditできるようにしたい。

まあ、のちのち、、、

スポンサーリンク