Nested Attributesって素晴らしそう。パート2
一つだけ解決出来なかったのが「new」と「edit」でrjsを共通化すること。
コントローラー
class Support::CablesetController < ApplicationController def edit @cableset = Support::Cableset::Cablesetha.find(params[:id]) @cableset.cablesetbes.build end def new @cableset = Support::Cableset::Cablesetha.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @cableset } end end def create @flash_message = "新規登録に失敗しました<br />" @cableset = Support::Cableset::Cablesetha.new(params[:support_cableset_cablesetha]) @cableset.cablesetbes.each{|i| if i.room_time.blank? || i.room_name.blank? || i.class_name.blank? || i.member_name.blank? @cableset.cablesetbes.delete(i) #空白なヤツはいらない end } @cu_flag = "ok" #重複確認 val_time = Array.new @cableset.cablesetbes.each{|i| val_time << i.room_time } #確認するところ } } if @cableset.cablesetbes.blank? @flash_message << "教室情報がありません<br />" @cu_flag = "miss" end if @cableset.save && @cu_flag == "ok" flash[:notice] = "作成は完了しました" redirect_to :action=>:top, :selectday=>@cableset.lended else @flash_message << "作成できませんでした" @cu_flag = "miss" end if @cu_flag == "miss" @cableset.cablesetbes.build flash[:notice] = @flash_message render :action=>:new end def update @flash_message = "更新に失敗しました<br />" @cableset = Support::Cableset::Cablesetha.find(params[:id]) @cu_flag = "ok" if params[:support_cableset_cablesetha][:cablesetbes_attributes].blank? @flash_message << "教室情報がありません<br />" @cu_flag = "miss" end if @cableset.update_attributes(params[:support_cableset_cablesetha]) && @cu_flag == "ok" @cableset.cablesetbes.each{|i| if i.room_name.blank? || i.class_name.blank? || i.member_name.blank? Support::Cableset::Cablesetbe.delete(i) end } flash[:notice] = @cableset.member_name + "を更新しました" redirect_to :action=>:top else @flash_message << "更新できませんでした" @cu_flag = "miss" end if @cu_flag == "miss" @cableset.cablesetbes.build flash[:notice] = @flash_message render :action=>:edit end end
本当ならモデルのvalidateで検証するべきところが、コントローラーの中に入り込んでいる。よくない。
createとupdateで検証の内容が異なる・・・よくない。
ビューもいけてない。
views/support/cableset/new.html.erb <%= render :partial => 'support/cableset/any/form_new' %> views/support/cableset/edit.html.erb <%= render :partial => 'support/cableset/any/form_edit' %> <%= button_to '削除する', {:action=>:destroy, :id=>@cableset }, :confirm=>'本当に削除していいですか?', :method=>'post' %>
異なるレイアウトを指定している。いけてない。
いけてない原因のテンプレートファイル
support/cableset/any/form_new.html.erb <%- form_for @cableset, :url=>{:action=>:create} do |f| %> ... <%= link_to_remote "追加または変更", :url=>{:controller=>"support/cableset", :action=>'add_new'}, :submit => "cableset_form" %> support/cableset/any/form_edit.html.erb <%- form_for @cableset, :url=>{:action=>:update, :id=>@cableset} do |f| %> ... <%= link_to_remote "追加または変更", :url=>{:controller=>"support/cableset", :action=>'add_edit', :id=>@cableset}, :submit => "cableset_form" %>
link_to_remoteを動的に作り直す方法がわかんなかった。
いけてない原因その2のRJSファイル
suppor/cableset/add_new.rjs @cableset = Support::Cableset::Cablesetha.new(params[:support_cableset_cablesetha]) cond_where = "booked_day = :booked_day AND jigen = :jigen AND classrooms.name = :class_name" build_flag = "ON" @cableset.cablesetbes.each{|i| # validate的な検証内容、ダメならOFF } @cableset.cablesetbes.build if build_flag == "ON" page.replace_html "cableset_form", :partial => 'support/cableset/any/form_new' support/cableset/add_edit.rjs @cableset = Support::Cableset::Cablesetha.find(params[:id]) cond_where = "booked_day = :booked_day AND jigen = :jigen AND classrooms.name = :class_name" build_flag = "ON" params[:support_cableset_cablesetha][:cablesetbes_attributes].each{|i| # validate的な検証内容、ダメならOFF # validate的なメッセージを作成 } page.alert(alert_message) if build_flag == "OFF" @cableset.cablesetbes.build if build_flag == "ON" page.replace_html "cableset_form", :partial => 'support/cableset/any/form_edit'
受けとる値の形式が異なるから、ループとか検証とか行うときに問題が出てくる。いけてない。
なんとか動く形にはなったけど、「Railsってすばらしー」ってな感動が低い。
もうちっと簡単に作れるようになるとうれしいな・・・