Reducerea codului redundant în Ruby on Rails

Folosesc Devise pentru autentificare în ruby on Rails și suprascriu controlerului de actualizare a înregistrării pentru a nu cere parola actuală pentru actualizările modelului Utilizator. Deci, codul de mai jos spune că "dacă utilizatorul nu furnizează parola, actualizați utilizând update_without_password , actualizați altfel folosind update_attributes ".

if resource_params["password"].empty?

    if resource.update_without_password(resource_params)
      if is_navigational_format?
        if resource.respond_to?(:pending_reconfirmation?) && resource.pending_reconfirmation?
          flash_key = :update_needs_confirmation
        end
        set_flash_message :notice, flash_key || :updated
      end
      sign_in resource_name, resource, :bypass => true
      respond_with resource, :location => after_update_path_for(resource)
    else
      clean_up_passwords resource
      respond_with resource
    end

else

    if resource.update_attributes(resource_params)
      if is_navigational_format?
        if resource.respond_to?(:pending_reconfirmation?) && resource.pending_reconfirmation?
          flash_key = :update_needs_confirmation
        end
        set_flash_message :notice, flash_key || :updated
      end
      sign_in resource_name, resource, :bypass => true
      respond_with resource, :location => after_update_path_for(resource)
    else
      clean_up_passwords resource
      respond_with resource
    end

end 

În mod clar, există loc pentru a reduce redundanța de cod aici, dar eu sunt încă nou la ruby ​​și mă întrebam dacă cineva ar putea sugera o modalitate curată de a scrie același lucru fără a duplica tot codul în imbricate dacă .

Mulțumiri!

0

1 răspunsuri

Dacă vă citesc corect și nu lipsesc nimic, există doar o singură linie de diferență acolo. Puteți scrie astfel:

result = if resource_params["password"].empty?
    resource.update_without_password(resource_params)
  else 
    resource.update_attributes(resource_params)
  end

if result
  if is_navigational_format?
    if resource.respond_to?(:pending_reconfirmation?) && resource.pending_reconfirmation?
      flash_key = :update_needs_confirmation
    end
    set_flash_message :notice, flash_key || :updated
  end
  sign_in resource_name, resource, :bypass => true
  respond_with resource, :location => after_update_path_for(resource)
else
  clean_up_passwords resource
  respond_with resource
end
0
adăugat
Perfect! Este exact ceea ce căutam, doar că nu am știut modul ruby pentru ao face.
adăugat autor Paul, sursa