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ってすばらしー」ってな感動が低い。 
もうちっと簡単に作れるようになるとうれしいな・・・