rails3で複数レコード修正は少しコードを書くと問題無く出来るですが、検証機能を使った後の赤枠(デフォルト)が出なく、困っていました。いろいろ試して出来たので、メモとして残しておきます。
エラー内容とエラー箇所が赤枠で表示されています。
books_controller.rb
def editall
@book = Book.all
end
def updates
@book = Book.update(params[:book].keys,params[:book].values)
@isError = false
@book.each{|book| @isError = true if book.errors.any?}
respond_to do |format|
if @isError == true
format.html { render action: "editall" }
format.json { render json: @book.errors, status: :unprocessable_entity }
else
format.html { redirect_to :action=>:index, notice: 'Book was successfully updated.' }
format.json { head :no_content }
end
end
end
ポイント:updateで一気に検証と修正してくれます。検証でエラーが発生している場合はupdateはされません。
eitall.html.erb
Editing book
<% if @isError == true then %>
<%#= pluralize(book.errors.count, "error") %> prohibited this book from being saved:
<% @book.each_with_index{|book,i| %>
<% if book.errors.any? %>
<% book.errors.full_messages.each do |msg| %>
- <%= "#{i+1}line: #{msg}" %>
<% end %>
<% end %>
<% } %>
<% end %>
<%= form_tag :action => :updates do %>
<% @book.each_with_index{|book,i| %>
<%= fields_for("book[]",book) {|f| %>
<%= f.text_field :title %> |
<%= f.text_field :price %> |
<%= f.text_field :content %> |
<% } %>
<% } %>
<%= submit_tag "送信" %>
<% end %>
どうもコードが正しく表示されないので、
Githubのリンクを張っておきますので、そこの¥app¥view¥book¥editallを参照してください。
ポイントはfields_forの"book[]" とXXXX_fieldの第一引数がモデルのフィールド名と同じにする。そうしないとバリデーションの結果の枠などが表示されない。
送信内容は以下のようになっています
"book"=>{"1"=>{"title"=>"rails", "price"=>"1", "content"=>""}, "2"=>{"title"=>"railsによるWeb", "price"=>"1000", "content"=>""}}
book.rb
class Book < ActiveRecord::Base
validates(:price,:numericality => {:greater_than => 10})
validates(:title,:length =>{:within => 1..5})
end
routes.rb
get 'books/editall'
post 'books/updates'
resources :books
ソースコード