OSDN Git Service

t#31715:speech_balloon boost
authoryasushiito <yas@pen-chan.jp>
Wed, 7 Aug 2013 10:09:23 +0000 (19:09 +0900)
committeryasushiito <yas@pen-chan.jp>
Wed, 7 Aug 2013 10:09:23 +0000 (19:09 +0900)
14 files changed:
app/controllers/speech_balloons_controller.rb
app/models/balloon.rb
app/models/ground_color.rb
app/models/ground_picture.rb
app/models/panel.rb
app/models/panel_picture.rb
app/models/speech.rb
app/models/speech_balloon.rb
app/models/speech_balloon_template.rb
app/views/panels/_body.html.erb
app/views/panels/_form.html.erb
lib/validators/extend_speech_balloon_validator.rb [new file with mode: 0644]
spec/models/balloon_spec.rb
spec/models/panel_spec.rb

index 038436c..f580d02 100644 (file)
@@ -54,19 +54,10 @@ class SpeechBalloonsController < ApplicationController
     
     @panel = Panel.edit(@author.working_panel, @author)
     @speech_balloon = SpeechBalloon.new :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id
-    @speech_balloon.extend @speech_balloon_template.engine_speech_balloon_module
+    @speech_balloon.boost
     @speech_balloon.supply_default
-    @balloon = @speech_balloon.build_balloon 
-    @speech = @speech_balloon.build_speech 
-    @balloon.extend @speech_balloon_template.engine_balloon_module
-    @speech.extend @speech_balloon_template.engine_speech_module
-    @balloon.new_speech_balloon = @speech_balloon
-    @speech.new_speech_balloon = @speech_balloon
-    @balloon.supply_default 
-    @speech.supply_default 
-    @speech_balloon_extend = @speech_balloon.extend_speech_balloon
-    @balloon_extend = @balloon.extend_balloon
-    @speech_extend = @speech.extend_speech
+    @speech_balloon.get_balloon.supply_default 
+    @speech_balloon.get_speech.supply_default 
     
     respond_to do |format|
       format.html {
@@ -81,15 +72,7 @@ class SpeechBalloonsController < ApplicationController
     @speech_balloon_template = @speech_balloon.speech_balloon_template
     @panel = Panel.edit(@speech_balloon.panel.id, @author)
     
-    @balloon = @speech_balloon.balloon 
-    @speech = @speech_balloon.speech 
-    @speech_balloon.extend @speech_balloon_template.engine_speech_balloon_module
-    @balloon.extend @speech_balloon_template.engine_balloon_module
-    @speech.extend @speech_balloon_template.engine_speech_module
-    
-    @speech_balloon_extend = @speech_balloon.extend_speech_balloon
-    @balloon_extend = @balloon.extend_balloon
-    @speech_extend = @speech.extend_speech
+    @speech_balloon.boost
     
     respond_to do |format|
       format.html {
@@ -99,68 +82,23 @@ class SpeechBalloonsController < ApplicationController
   end
 
   def create
-    speech_balloon_settings = params[:speech_balloon][:settings]
-    if speech_balloon_settings.blank?
-      speech_balloon_settings = {}
-    else
-      if speech_balloon_settings.is_a?(Hash)
-        params[:speech_balloon][:settings] = speech_balloon_settings.to_json
-      else
-        speech_balloon_settings = {}
-      end
-    end
-    balloon_settings = params[:speech_balloon][:balloon_attributes][:settings]
-    if balloon_settings.blank?
-      balloon_settings = {}
-    else
-      if balloon_settings.is_a?(Hash)
-        params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json
-      else
-        balloon_settings = {}
-      end
-    end
-    speech_settings = params[:speech_balloon][:speech_attributes][:settings]
-    if speech_settings.blank?
-      speech_settings = {}
-    else
-      if speech_settings.is_a?(Hash)
-        params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json
-      else
-        speech_settings = {}
-      end
-    end
+    SpeechBalloon.fold_extend_settings params
     @panel = Panel.edit(@author.working_panel, @author)
     @speech_balloon = SpeechBalloon.new 
     @speech_balloon.attributes = params[:speech_balloon]
     
     @speech_balloon_template = @speech_balloon.speech_balloon_template
-    @balloon = @speech_balloon.balloon 
-    @speech = @speech_balloon.speech 
-    
-    @speech_balloon.extend @speech_balloon_template.engine_speech_balloon_module
-    @balloon.extend @speech_balloon_template.engine_balloon_module
-    @speech.extend @speech_balloon_template.engine_speech_module
-    
-    @balloon.new_speech_balloon = @speech_balloon
-    @speech.new_speech_balloon = @speech_balloon
-    
-    @speech_balloon.extend_speech_balloon = speech_balloon_settings
-    @balloon.extend_balloon = balloon_settings
-    @speech.extend_speech = speech_settings
+    @speech_balloon.boost
     
-    @speech_balloon_extend = @speech_balloon.extend_speech_balloon
-    @balloon_extend = @balloon.extend_balloon
-    @speech_extend = @speech.extend_speech
-    
-    params[:speech_balloon][:balloon_attributes][:system_picture_id] = @balloon.select_system_picture 
+    params[:speech_balloon][:balloon_attributes][:system_picture_id] = @speech_balloon.get_balloon.select_system_picture 
     
     @speech_balloon.overwrite @panel.id
     
     respond_to do |format|
-      sbv = @speech_balloon_extend.valid?
-      bv = @balloon_extend.valid?
-      sv = @speech_extend.valid?
-      if @speech_balloon.valid? and @speech_balloon_extend.valid? and @balloon_extend.valid? and @speech_extend.valid? and sbv and bv and sv
+      sbv = @speech_balloon.extend_speech_balloon.valid?
+      bv = @speech_balloon.get_balloon.extend_balloon.valid?
+      sv = @speech_balloon.get_speech.extend_speech.valid?
+      if @speech_balloon.valid? and @speech_balloon.get_balloon.valid? and @speech_balloon.get_speech.valid? and sbv and bv and sv
         if @speech_balloon.store @author, params[:speech_balloon]
           flash[:notice] = I18n.t('flash.notice.created', :model => Panel.model_name.human)
           format.html { redirect_to @panel }
@@ -183,66 +121,23 @@ class SpeechBalloonsController < ApplicationController
   end
 
   def update
-    speech_balloon_settings = params[:speech_balloon][:settings]
-    if speech_balloon_settings.blank?
-      speech_balloon_settings = {}
-    else
-      if speech_balloon_settings.is_a?(Hash)
-        params[:speech_balloon][:settings] = speech_balloon_settings.to_json
-      else
-        speech_balloon_settings = {}
-      end
-    end
-    balloon_settings = params[:speech_balloon][:balloon_attributes][:settings]
-    if balloon_settings.blank?
-      balloon_settings = {}
-    else
-      if balloon_settings.is_a?(Hash)
-        params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json
-      else
-        balloon_settings = {}
-      end
-    end
-    speech_settings = params[:speech_balloon][:speech_attributes][:settings]
-    if speech_settings.blank?
-      speech_settings = {}
-    else
-      if speech_settings.is_a?(Hash)
-        params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json
-      else
-        speech_settings = {}
-      end
-    end
+    SpeechBalloon.fold_extend_settings params
     @speech_balloon = SpeechBalloon.show(params[:id], @author)
     @speech_balloon.attributes = params[:speech_balloon]
     
     @speech_balloon_template = @speech_balloon.speech_balloon_template
-    @speech_balloon.extend @speech_balloon.speech_balloon_template.engine_speech_balloon_module
-    @balloon = @speech_balloon.balloon 
-    @speech = @speech_balloon.speech 
-    
-    @speech_balloon.extend @speech_balloon_template.engine_speech_balloon_module
-    @balloon.extend @speech_balloon_template.engine_balloon_module
-    @speech.extend @speech_balloon_template.engine_speech_module
-    
-    @speech_balloon.extend_speech_balloon = speech_balloon_settings
-    @balloon.extend_balloon = balloon_settings
-    @speech.extend_speech = speech_settings
-    
-    @speech_balloon_extend = @speech_balloon.extend_speech_balloon
-    @balloon_extend = @balloon.extend_balloon
-    @speech_extend = @speech.extend_speech
+    @speech_balloon.boost
     
-    params[:speech_balloon][:balloon_attributes][:system_picture_id] = @balloon.select_system_picture 
+    params[:speech_balloon][:balloon_attributes][:system_picture_id] = @speech_balloon.get_balloon.select_system_picture 
     
     @panel = Panel.edit(@speech_balloon.panel.id, @author)
     @speech_balloon.overwrite @panel.id
     
     respond_to do |format|
-      sbv = @speech_balloon_extend.valid?
-      bv = @balloon_extend.valid?
-      sv = @speech_extend.valid?
-      if @speech_balloon.valid? and @speech_balloon_extend.valid? and @balloon_extend.valid? and @speech_extend.valid? and sbv and bv and sv
+      sbv = @speech_balloon.extend_speech_balloon.valid?
+      bv = @speech_balloon.get_balloon.extend_balloon.valid?
+      sv = @speech_balloon.get_speech.extend_speech.valid?
+      if @speech_balloon.valid? and @speech_balloon.get_balloon.valid? and @speech_balloon.get_speech.valid? and sbv and bv and sv
         if @speech_balloon.store @author, params[:speech_balloon]
           flash[:notice] = I18n.t('flash.notice.updated', :model => SpeechBalloon.model_name.human)
           format.html { redirect_to @speech_balloon }
index 04bc130..ad064a1 100644 (file)
@@ -44,8 +44,16 @@ class Balloon < ActiveRecord::Base
 self.system_picture_id = 1
   end
   
+  def new_speech_balloon
+    @new_speech_balloon
+  end
+  
+  def new_speech_balloon= v
+    @new_speech_balloon = v
+  end
+  
   def get_speech_balloon
-    self.speech_balloon
+    self.speech_balloon || @new_speech_balloon
   end
   
   def get_panel_id
index 7117e4b..b3c4e23 100644 (file)
@@ -88,6 +88,9 @@ class GroundColor < ActiveRecord::Base
     self.panel || @new_panel
   end
   
+  def boost
+  end
+  
   def tag_id c = nil
     'panel' + tag_panel_id + 'ground_color' + tag_element_id + c.to_s
   end
index b77bc6a..3fdf842 100644 (file)
@@ -103,6 +103,9 @@ class GroundPicture < ActiveRecord::Base
     self.panel || @new_panel
   end
   
+  def boost
+  end
+  
   def tag_id c = nil
     'panel' + tag_panel_id + 'ground_picture' + tag_element_id + c.to_s
   end
index 0bb2cbb..5ad5727 100644 (file)
@@ -329,6 +329,7 @@ class Panel < ActiveRecord::Base
     Panel.transaction do
       self.panel_elements.each do |elm|
         elm.new_panel = self
+        elm.boost
       end
 #self.publish = nil
       res = self.save
index 36e7699..e4cfacf 100644 (file)
@@ -127,6 +127,9 @@ class PanelPicture < ActiveRecord::Base
     self.panel || @new_panel
   end
   
+  def boost
+  end
+  
   def tag_id c = nil
     'panel' + tag_panel_id + 'panel_picture' + tag_element_id + c.to_s
   end
index 62720b4..9bf34cd 100644 (file)
@@ -37,8 +37,16 @@ class Speech < ActiveRecord::Base
     self.speech_balloon.panel.visible? roles
   end
   
+  def new_speech_balloon
+    @new_speech_balloon
+  end
+  
+  def new_speech_balloon= v
+    @new_speech_balloon = v
+  end
+  
   def get_speech_balloon
-    self.speech_balloon
+    self.speech_balloon || @new_speech_balloon
   end
   
   def get_panel_id
index 1301c31..e19eca1 100644 (file)
@@ -14,7 +14,7 @@ class SpeechBalloon < ActiveRecord::Base
   validates :classname, :presence => true, :length => {:maximum => 50}
   validates :z, :presence => true, :numericality => {:greater_than => 0}
   validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
-#  validates :settings, :presence => true
+  validates :settings, :extend_speech_balloon => true
   
   before_validation :valid_encode
   
@@ -88,6 +88,73 @@ class SpeechBalloon < ActiveRecord::Base
     self.panel || @new_panel
   end
   
+  def new_sballoon
+    @new_balloon
+  end
+  
+  def new_balloon= v
+    @new_balloon = v
+  end
+  
+  def get_balloon
+    self.balloon || @new_balloon
+  end
+  
+  def new_speech
+    @new_speech
+  end
+  
+  def new_speech= v
+    @new_speech = v
+  end
+  
+  def get_speech
+    self.speech || @new_speech
+  end
+  
+  def boost
+    self.extend self.speech_balloon_template.engine_speech_balloon_module
+    if self.balloon
+    else
+      self.new_balloon = self.build_balloon 
+      self.new_speech = self.build_speech 
+    end
+    self.get_balloon.extend self.speech_balloon_template.engine_balloon_module
+    self.get_speech.extend self.speech_balloon_template.engine_speech_module
+    self.get_balloon.new_speech_balloon = self
+    self.get_speech.new_speech_balloon = self
+    self.extend_speech_balloon = if self.settings.blank?
+      {}
+    else
+      JSON.parse(self.settings)
+    end
+    self.get_balloon.extend_balloon = if self.get_balloon.settings.blank?
+      {}
+    else
+      JSON.parse(self.get_balloon.settings)
+    end
+    self.get_speech.extend_speech = if self.get_speech.settings.blank?
+      {}
+    else
+      JSON.parse(self.get_speech.settings)
+    end
+  end
+  
+  def self.fold_extend_settings params
+    speech_balloon_settings = params[:speech_balloon][:settings]
+    if speech_balloon_settings.is_a?(Hash)
+      params[:speech_balloon][:settings] = speech_balloon_settings.to_json
+    end
+    balloon_settings = params[:speech_balloon][:balloon_attributes][:settings]
+    if balloon_settings.is_a?(Hash)
+      params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json
+    end
+    speech_settings = params[:speech_balloon][:speech_attributes][:settings]
+    if speech_settings.is_a?(Hash)
+      params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json
+    end
+  end
+  
   def tag_id c = nil
     'panel' + tag_panel_id + 'speech_balloon' + tag_element_id + c.to_s
   end
index 4aa68e5..62b5c5f 100644 (file)
@@ -37,6 +37,12 @@ class SpeechBalloonTemplate < ActiveRecord::Base
     SpeechBalloonTemplate.find(:all, opt)
   end
   
+  def self.enable_list
+    SpeechBalloonTemplate.list.delete_if {|sbt|
+      Pettanr::Application.speech_balloons[sbt.classname] == nil
+    }
+  end
+  
   def self.list_opt
     {}
   end
index a25be02..89e4abb 100644 (file)
@@ -1,19 +1,7 @@
 <% panel.panel_elements.each do |elm| %>
   <% case elm.class.to_s %>
   <% when 'SpeechBalloon' %>
-    <% 
-      speech_balloon = elm
-      speech_balloon_template = speech_balloon.speech_balloon_template
-      balloon = speech_balloon.balloon 
-      speech = speech_balloon.speech 
-      speech_balloon.extend speech_balloon_template.engine_speech_balloon_module
-      balloon.extend speech_balloon_template.engine_balloon_module
-      speech.extend speech_balloon_template.engine_speech_module
-      
-      balloon.new_speech_balloon = speech_balloon
-      speech.new_speech_balloon = speech_balloon
-      
-    %>
+    <% elm.boost %>
   <% end %>
 <% end %>
 <div id="<%= panel.tag_id -%>" panel_id="<%= panel.tag_panel_id -%>" class="pettanr-comic-panel" style="width:<%= panel.width %>px;height:<%= panel.height %>px;border-style: solid;border-width: <%= panel.border %>px;border-color:black; background-color:white;">
index 3cf438e..0e20344 100644 (file)
             <% when 'PanelPicture' %>
               <%= render 'panel_pictures/form', :panel_picture => elm, :no_attr => 0 %>
             <% when 'SpeechBalloon' %>
-              <% 
-                speech_balloon = elm
-                speech_balloon_template = speech_balloon.speech_balloon_template
-                balloon = speech_balloon.balloon 
-                speech = speech_balloon.speech 
-                
-                speech_balloon_extend = speech_balloon.extend_speech_balloon
-                balloon_extend = balloon.extend_balloon
-                speech_extend = speech.extend_speech
-              %>
-              <%= render elm.speech_balloon_template.engine_name + '/speech_balloons/form', :speech_balloon => speech_balloon, :balloon => balloon, :speech => speech, :speech_balloon_extend => speech_balloon_extend, :balloon_extend => balloon_extend, :speech_extend => speech_extend, :no_attr => 0 %>
+              <% elm.boost %>
+              <%= render elm.speech_balloon_template.engine_name + '/speech_balloons/form', :speech_balloon => elm, :no_attr => 0 %>
             <% when 'GroundPicture' %>
               <%= render 'ground_pictures/form', :ground_picture => elm, :no_attr => 0 %>
             <% when 'GroundColor' %>
                     </li>
                   <% end %>
                 </ul>
-                <% SpeechBalloonTemplate.list().each_with_index do |sbt, index| %>
+                <% SpeechBalloonTemplate.enable_list().each_with_index do |sbt, index| %>
                   <div id="new-speech_balloon-tabs-<%= index -%>">
                     <% elm = SpeechBalloon.new :panel_id => @panel.id, :speech_balloon_template_id => sbt.id %>
                     <% 
-                      speech_balloon = elm
-                      speech_balloon_template = speech_balloon.speech_balloon_template
-                      speech_balloon.extend speech_balloon_template.engine_speech_balloon_module
-                      speech_balloon.supply_default
-                      balloon = speech_balloon.build_balloon 
-                      speech = speech_balloon.build_speech 
-                      balloon.extend speech_balloon_template.engine_balloon_module
-                      speech.extend speech_balloon_template.engine_speech_module
-                      
-                      speech_balloon_extend = speech_balloon.extend_speech_balloon
-                      balloon_extend = balloon.extend_balloon
-                      speech_extend = speech.extend_speech
-                      
-                      balloon.new_speech_balloon = speech_balloon
-                      speech.new_speech_balloon = speech_balloon
-                      balloon.supply_default 
-                      speech.supply_default 
+                      elm.boost
+                      elm.supply_default
+                      elm.get_balloon.supply_default 
+                      elm.get_speech.supply_default 
                     %>
-                    <%= render elm.speech_balloon_template.engine_name + '/speech_balloons/form', :speech_balloon => speech_balloon, :balloon => balloon, :speech => speech, :speech_balloon_extend => speech_balloon_extend, :balloon_extend => balloon_extend, :speech_extend => speech_extend, :no_attr => 1 %>
+                    <%= render elm.speech_balloon_template.engine_name + '/speech_balloons/form', :speech_balloon => elm, :no_attr => 1 %>
                   </div>
                 <% end %>
             <% when 'GroundPicture' %>
     </div>
     <script>
     <!--
-      <% SpeechBalloonTemplate.list().each do |sbt| %>
+      <% SpeechBalloonTemplate.enable_list().each do |sbt| %>
         var <%= h(sbt.engine_name) %>_settings = <%= raw sbt.parsed_settings.to_json -%>;
       <% end %>
     // -->
     </script>
-    <% SpeechBalloonTemplate.list().each do |sbt| %>
+    <% SpeechBalloonTemplate.enable_list().each do |sbt| %>
       <%= stylesheet_link_tag sbt.engine_name + "/application" %>
       <%= javascript_include_tag sbt.engine_name + "/application" %>
     <% end %>
diff --git a/lib/validators/extend_speech_balloon_validator.rb b/lib/validators/extend_speech_balloon_validator.rb
new file mode 100644 (file)
index 0000000..48bfabc
--- /dev/null
@@ -0,0 +1,6 @@
+class ExtendSpeechBalloonValidator < ActiveModel::EachValidator\r
+  def validate_each(record, attribute, value)\r
+    record.errors[attribute] << (options[:message] || I18n.t('activerecord.errors.messages.natural_number')) unless record.extend_speech_balloon.valid?\r
+  end\r
+end\r
+\r
index bf58566..20dd184 100644 (file)
@@ -14,16 +14,22 @@ describe Balloon do
     @lg = FactoryGirl.create :license_group\r
     @license = FactoryGirl.create :license, :license_group_id => @lg.id, :system_picture_id => @sp.id\r
     \r
-    @speech_balloon_template = FactoryGirl.create :speech_balloon_template\r
+    @speech_balloon_template = FactoryGirl.create :speech_balloon_template, "name" => "circle@pettan.com", "classname" => "CircleSpeechBalloon", "caption" => "cc",  "system_picture_id" => @sp.id, "settings" => '{}'\r
     @writing_format = FactoryGirl.create :writing_format\r
     @panel = FactoryGirl.create :panel, :author_id => @author.id\r
   end\r
   \r
   describe '検証に於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
-      @balloon = FactoryGirl.build :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     context 'オーソドックスなデータのとき' do\r
       it '下限データが通る' do\r
@@ -165,9 +171,15 @@ describe Balloon do
   \r
   describe '文字コード検証に於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
-      @balloon = FactoryGirl.build :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     \r
     context 'settingsを検証するとき' do\r
@@ -182,9 +194,15 @@ describe Balloon do
   \r
   describe '閲覧許可に於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     context 'オープンモードのとき' do\r
       before do\r
@@ -261,9 +279,15 @@ describe Balloon do
   \r
   describe '一覧取得に於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     context 'page補正について' do\r
       it '文字列から数値に変換される' do\r
@@ -304,14 +328,29 @@ describe Balloon do
     it '時系列で並んでいる' do\r
       #公開されたコマのフキダシ枠は(他人のフキダシ枠であっても)含んでいる\r
       hc = FactoryGirl.create :panel, :author_id => @other_author.id, :publish => 1\r
-      nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
-      npl = FactoryGirl.create :balloon, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
+      nsb = FactoryGirl.build :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
+      nsb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      npl =nsb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id, :updated_at => Time.now + 100)\r
+      )\r
+      nsb.boost\r
+      nsb.save!\r
       r = Balloon.list\r
       r.should eq [npl, @balloon]\r
     end\r
     it '非公開のコマのフキダシ枠は自分のフキダシ枠であっても含まない' do\r
       hc = FactoryGirl.create :panel, :author_id => @author.id, :publish => 0\r
-      nsb = FactoryGirl.create :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
+      nsb = FactoryGirl.build :speech_balloon, :panel_id => hc.id, :speech_balloon_template_id => @speech_balloon_template.id, :updated_at => Time.now + 100\r
+      nsb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      nsb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      nsb.boost\r
+      nsb.save!\r
       npl = FactoryGirl.create :balloon, :speech_balloon_id => nsb.id, :updated_at => Time.now + 100\r
       pl = Balloon.list\r
       pl.should eq [@balloon]\r
@@ -388,9 +427,15 @@ describe Balloon do
   end\r
   describe 'json一覧出力オプションに於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     it 'フキダシを含んでいる' do\r
       r = Balloon.list.to_json Balloon.list_json_opt\r
@@ -430,9 +475,15 @@ describe Balloon do
   \r
   describe '単体取得に於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     context 'つつがなく終わるとき' do\r
       it '単体取得オプションを利用している' do\r
@@ -499,9 +550,15 @@ describe Balloon do
   end\r
   describe 'json単体出力オプションに於いて' do\r
     before do\r
-      @sb = FactoryGirl.create :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
-      @balloon = FactoryGirl.create :balloon, :speech_balloon_id => @sb.id, :system_picture_id => @sp.id\r
-      @speech = FactoryGirl.create :speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id\r
+      @sb = FactoryGirl.build :speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @speech_balloon_template.id\r
+      @speech = @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @balloon = @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
     end\r
     it 'フキダシを含んでいる' do\r
       r = Balloon.show(@balloon.id, @author).to_json Balloon.show_json_opt\r
index 56e1821..64149e9 100644 (file)
@@ -17,7 +17,7 @@ describe Panel do
     @op = FactoryGirl.create :original_picture, :artist_id => @artist.id\r
     @p = FactoryGirl.create :picture, :original_picture_id => @op.id, :license_id => @license.id, :artist_id => @artist.id\r
     @rp = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op.id, :picture_id => @p.id\r
-    @sbt = FactoryGirl.create :speech_balloon_template\r
+    @sbt = FactoryGirl.create :speech_balloon_template, "name" => "circle@pettan.com", "classname" => "CircleSpeechBalloon", "caption" => "cc",  "system_picture_id" => @sp.id, "settings" => '{}'\r
   end\r
   \r
   describe '検証に於いて' do\r
@@ -762,9 +762,17 @@ describe Panel do
       #コマを作成しておく。\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
       )\r
@@ -791,9 +799,17 @@ describe Panel do
       #コマを作成しておく。\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 0, :z => 2, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 1, :z => 1)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2, :z => 3)\r
       )\r
@@ -823,9 +839,17 @@ describe Panel do
     end\r
     context 'さらに末尾にフキダシを追加したとき' do\r
       before do\r
-        @sb2 = @panel.speech_balloons.create(\r
+        @sb2 = @panel.speech_balloons.build(\r
           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4, :z => 5)\r
         )\r
+        @sb2.build_balloon(\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+        )\r
+        @sb2.build_speech(\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+        )\r
+        @sb2.boost\r
+        @sb2.save!\r
         @panel.reload\r
       end\r
       it 'zでソートしている' do\r
@@ -843,9 +867,17 @@ describe Panel do
       #コマを作成しておく。\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
       )\r
@@ -874,9 +906,17 @@ describe Panel do
     end\r
     context 'さらに末尾にフキダシを追加したとき' do\r
       before do\r
-        @sb2 = @panel.speech_balloons.create(\r
+        @sb2 = @panel.speech_balloons.build(\r
           FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4)\r
         )\r
+        @sb2.build_balloon(\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+        )\r
+        @sb2.build_speech(\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+        )\r
+        @sb2.boost\r
+        @sb2.save!\r
         @panel.reload\r
       end\r
       it 'tでソートしている' do\r
@@ -894,9 +934,17 @@ describe Panel do
       #コマを作成しておく。\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
       )\r
@@ -939,14 +987,22 @@ describe Panel do
       #コマを作成しておく。\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @sb.create_balloon(\r
-        FactoryGirl.attributes_for(:balloon, :speech_balloon_id => @sb.id)\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
       )\r
       @sb.create_speech(\r
-        FactoryGirl.attributes_for(:speech, :speech_balloon_id => @sb.id, :writing_format_id => @writing_format.id)\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
       )\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
@@ -1012,9 +1068,17 @@ describe Panel do
       @rp2 = FactoryGirl.create :resource_picture, :artist_id => @artist.id, :license_id => @license.id, :original_picture_id => @op2.id, :picture_id => @p2.id\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height, :picture_id => @p.id\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 2)\r
       )\r
@@ -1121,23 +1185,27 @@ describe Panel do
           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1, :z => 1+1)\r
         )\r
         sb1 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
         )\r
         sb1.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb1.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb1.boost\r
+        sb1.save!\r
         sb2 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3, :z => 3+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 3, :z => 3+1)\r
         )\r
         sb2.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb2.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb2.boost\r
+        sb2.save!\r
         @gc = @panel.ground_colors.build(\r
           FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 4, :z => 4+1)\r
         )\r
@@ -1158,23 +1226,27 @@ describe Panel do
           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1, :z => 1+1)\r
         )\r
         sb1 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
         )\r
         sb1.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb1.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb1.boost\r
+        sb1.save!\r
         sb2 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 4, :z => 3+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 4, :z => 3+1)\r
         )\r
         sb2.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb2.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb2.boost\r
+        sb2.save!\r
         @gc = @panel.ground_colors.build(\r
           FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 4, :z => 4+1)\r
         )\r
@@ -1195,23 +1267,27 @@ describe Panel do
           FactoryGirl.attributes_for(:panel_picture, :panel_id => @panel.id, :picture_id => @p.id, :t => 1, :z => 0+1)\r
         )\r
         sb1 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 2, :z => 2+1)\r
         )\r
         sb1.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb1.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb1.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb1.boost\r
+        sb1.save!\r
         sb2 = @panel.speech_balloons.build(\r
-          FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 3, :z => 3+1)\r
+          FactoryGirl.attributes_for(:speech_balloon, :speech_balloon_template_id => @sbt.id, :t => 3, :z => 3+1)\r
         )\r
         sb2.build_balloon(\r
-          FactoryGirl.attributes_for(:balloon, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
         )\r
         sb2.build_speech(\r
-          FactoryGirl.attributes_for(:speech, :speech_balloon_id => sb2.id)\r
+          FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
         )\r
+        sb2.boost\r
+        sb2.save!\r
         @gc = @panel.ground_colors.build(\r
           FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id, :t => 4, :z => 4+1)\r
         )\r
@@ -1292,14 +1368,76 @@ describe Panel do
     end\r
   end\r
   \r
+  describe '要素の検証に於いて' do\r
+    before do\r
+      @panel = Panel.new\r
+      @panel.supply_default\r
+      @attr = FactoryGirl.attributes_for :panel\r
+@sbattr = {\r
+  "speech_balloons_attributes" => {\r
+    "0" => {\r
+      "caption" => "大きな文字で","z" => "1","t" => "0",\r
+      "classname" => "CircleSpeechBalloon","speech_balloon_template_id" => @sbt.id,\r
+      "speech_attributes" => {\r
+        "content" => "カギッコ","x" => "20","y" => "20","width" => "-60","height" => "60",\r
+        "settings" => "","writing_format_id" => @writing_format.id\r
+      },\r
+      "balloon_attributes" => {\r
+        "r" => "247","x" => "293","y" => "-2","width" => "200","height" => "200",\r
+        "system_picture_id" => @sp.id,"settings" => ""\r
+      }\r
+    }\r
+  },\r
+  "publish" => "0"\r
+}\r
+@ppattr = {\r
+  "panel_pictures_attributes" => {\r
+    "4" => {\r
+      "caption" => "司会","x" => "a","y" => "99","z" => "1","t" => "0",\r
+      "width" => "156","height" => "245","link" => "","picture_id" => @p.id\r
+    }\r
+  },\r
+  "publish" => "0"\r
+}\r
+    end\r
+    context 'フキダシの幅がマイナスで検証に失敗したとき' do\r
+      before do\r
+        @attr.merge!(@sbattr)\r
+      end\r
+      it 'エラーメッセージがセットされている' do\r
+        r = @panel.store @attr, @author\r
+        r.should be_false\r
+        @panel.errors.should_not be_empty\r
+      end\r
+    end\r
+    context 'コマ絵の横軸はアルファベットのため検証に失敗したとき' do\r
+      before do\r
+        @attr.merge!(@ppattr)\r
+      end\r
+      it 'エラーメッセージがセットされている' do\r
+        r = @panel.store @attr, @author\r
+        r.should be_false\r
+        @panel.errors.should_not be_empty\r
+      end\r
+    end\r
+  end\r
+  \r
   describe '削除に於いて' do\r
     before do\r
       @comic = FactoryGirl.create :comic, :author_id => @author.id\r
       @panel = FactoryGirl.create :panel, :author_id => @author.id, :publish => 1\r
       @pp = FactoryGirl.create :panel_picture, :panel_id => @panel.id, :t => 1, :width => @p.width, :height => @p.height\r
-      @sb = @panel.speech_balloons.create(\r
+      @sb = @panel.speech_balloons.build(\r
         FactoryGirl.attributes_for(:speech_balloon, :panel_id => @panel.id, :speech_balloon_template_id => @sbt.id, :t => 0)\r
       )\r
+      @sb.build_balloon(\r
+        FactoryGirl.attributes_for(:balloon, :system_picture_id => @sp.id)\r
+      )\r
+      @sb.build_speech(\r
+        FactoryGirl.attributes_for(:speech, :writing_format_id => @writing_format.id)\r
+      )\r
+      @sb.boost\r
+      @sb.save!\r
       @gc = @panel.ground_colors.create(\r
         FactoryGirl.attributes_for(:ground_color, :panel_id => @panel.id)\r
       )\r