F677fa685a2cfe8aff31f161062db3d3

I have a rails specific question(hopefully I can still get some help) with using the update action to either create a new object if it doesn't exist, or update it if it already exists. I'm not even sure if the implementation is right, but if it is, I know this can be refactored somehow.

def update
   respond_to do |format|
     if logged_in_user.spec.nil?
       @spec = Spec.new(params[:spec])
       @spec["user_id"] = logged_in_user.id
       if @spec.save
          format.js do
            render :update do |page|
              page.form.reset 'login_form'
              page.redirect_to user_path(logged_in_user)
            end
          end
        else
          format.js do
            render :update do |page|            
              page << "$('message_popup').popup.show();"
            end
          end 
       end
     else
      if logged_in_user.spec.update_attributes(params[:spec])
        format.js do
            render :update do |page|
              page.redirect_to user_path(logged_in_user)
            end
          end
        else
          format.js do
            render :update do |page|            
              page << "$('message_popup').popup.show();"
            end
          end 
      end
     end     
   end 
  end

Refactorings

No refactoring yet !

A8d3f35baafdaea851914b17dae9e1fc

Adam

January 27, 2009, January 27, 2009 06:08, permalink

1 rating. Login to rate!
class SpecsController < ApplicationController
  def update
    @spec = logged_in_user.spec || logged_in_user.build_spec
    spec_was_a_new_record = @spec.new_record?
    
    render :update do |page|
      if @spec.update_attributes(params[:spec])
        page.form.reset 'login_form' if spec_was_a_new_record
        page.redirect_to user_url(logged_in_user)
      else
        page.popup.show 'message_popup'
      end
    end
  end
end
var Popup = {
  show: function(element) {
    $(element).popup.show();
  }
}
55502f40dc8b7c769880b10874abc9d0

pypiyush.myopenid.com

January 31, 2009, January 31, 2009 20:09, permalink

No rating. Login to rate!

Try this out If It could be beneficial to You... I have moved the statements related to storing spec details in "spec" model. You can use the same method "save_spec_details" to create as well as save records.

def update
  @spec = logged_in_user.spec.nil? ? Spec.new : logged_in_user.spec
  params[:spec].merge{(:user_id => logged_in_user.id )}
  spec_status =  @spec.save_spec_details(params[:spec])
  render :update do |page|
    if spec_status.blank?
      page.form.reset 'login_form' if spec_was_a_new_record
      page.redirect_to user_url(logged_in_user)  
    else 
      # Display Validation messages in appropriate div element of the page.
      # page.replace_html "div_name", spec_status.full_messages.join("<br>")
      page << "$('message_popup').popup.show();"
    end
  end
end


ClassSpec < ActiveRecord::Base

  def save_spec_details(parameters)      
   spec = self.new_record? ? Spec.create(parameters) : self.update_attributes(parameters)
   return spec.errors
  end
end

Your refactoring





Format Copy from initial code

or Cancel