13 Oct
duccio

duccio il 13 October 2006 parla di Rails Snippet

in_place_editor con la validazione

Mi si è presentato il problema di dover validare la modifica dei dati tramite l’in_place_editor, io ho trovato una soluzione che può essere riutilizzata, leggermente migliorabile, ma comunque utile.

Per utilizzare l’in_place_editor con la validazione ho creato un file user_defined_function.rb da mettere nella cartella lib dell’applicazione:

    1 module UserDefinedFunction
    2   
    3   def self.append_features(base)
    4     base.extend(ClassMethods)
    5   end
    6   
    7   module ClassMethods
    8     #The default Rails helpers do not check for validation
    9     #before saving the attributes
   10     #this function provides a way of safely editing 
   11     #a models attribute without destroying data integrity
   12     def ajax_edit_field(model_name, model_attribute)
   13       class_eval %{
   14         def set_#{model_name}_#{model_attribute} 
   15           model_instance = #{model_name.to_s.camelize}.find(params[:id])
   16           model_instance.#{model_attribute.to_s} = params[:value]
   17           model_instance.save
   18           @#{model_name} = model_instance
   19           render :update do |page|
   20            page.call "form_remove", "#{model_name}_#{model_attribute}_"+params[:id]
   21            page.replace('#{model_name}_#{model_attribute}_'+params[:id]+'_in_place_editor', in_place_editor_field(:#{model_name},:#{model_attribute}))
   22            if !model_instance.errors.on("#{model_attribute}").nil?  
   23             page.replace('#{model_name}_#{model_attribute}_'+params[:id]+'_in_place_editor', render(:partial => "shared/in_place_form", :locals => {:model_name => "#{model_name}", :model_attribute => "#{model_attribute}", :id => params[:id].to_s, :er => model_instance.errors.on("#{model_attribute}")}))
   24            end
   25           end    
   26         end
   27       }
   28     end
   29   end
   30 end

Per funzionare serve includere in un file .js dove ci sono le vostre funzioni private, nel quale definire una funzione che io ho chiamato form_remove con la quale elimino dal dom il form dell’in_place_editor generato dopo l’errore del salvataggio.

Ecco la funzione form_remove:

    1 function form_remove(id){
    2   if($(id+"_form")){
    3     var d = document.getElementById('content-div');
    4     var r = document.getElementById(id+"_form");
    5     var e = document.getElementById(id+"_error");
    6     d.removeChild(r);
    7     d.removeChild(e);
    8   }

Prima di utilizzare l’in_place_editor con la vlidazione dovrete creare un parziale chimato _in_place_form:

    1 <span id="<%= model_name %>_<%= model_attribute%>_<%= id %>_in_place_editor"> </span>
    2 <div id="content-div">
    3 <%= form_remote_tag :url => {:action => "set_#{model_name}_#{model_attribute}"}, :html => {:id => "#{model_name}_#{model_attribute}_#{id}_form" }%>
    4 <input type="text" name="value" style="background-color: rgb(255, 255, 153);" class="editor_field"/>
    5 <input type="submit" value="ok" class="editor_ok_button"/>
    6 <a href="#" class="editor_cancel">cancel</a>
    7 </form>
    8 <p id="<%= model_name %>_<%= model_attribute%>_<%= id %>_error"><%= er %></p>
    9 </div>

Adesso includete il file nel vostro application_controller:

    1 include UserDefinedFunction

A questo punto per utilizzare l’in_place_editor con la validazione mettete nel vostro controllore (vediamone uno di esempio)

    1 class Admin::Contents::ContentsController < Admin::BaseController
    2   ajax_edit_field :content_item, :title
    3   ajax_edit_field :content_item, :body
    4   
    5   ...
    6 end

e nelle vostre viste:

    1 <p><%= in_place_editor_field : content_item, :title %> </p>

Come si potrebbe migliorare secondo me?

cercando di includere la funzione js all’interno del render partial in user_defined_function.rb. Io ci ho provato con page << ma mi ha dato errori e non ho avuto tempo di capire come mai!!!

Scrivi un commento