6 Nov
duccio

duccio il 6 November 2006 parla di Rails Snippet

In_place_select_editor e Array

Già più volte vi ho parlato degli in_place_editing fornendo alcune soluzioni per espanderne le funzionalità; ultimamente ho avuto un altro piccolo problema. In un piccolo progetto che stiamo curando dovevo riempire la select con dei valori recuperati da un Array, non avendo modelli dove definire le relazioni e quindi facilitare l’accesso ai valori interessati, ho pensato a questa piccola soluzione. Cerco di chiarire (almeno ci provo): chiamo una tabella col nome Events e definisco alcuni campi:

    1 class CreateEvents < ActiveRecord::Migration
    2   def self.up
    3     create_table :events do |t|
    4       t.column "title", :string
    5       t.column "object", :string
    6       t.column "body", :text
    7       t.column "category_id", :integer, :limit => 2
    8       t.column "extended_body", :text
    9       t.column "created_at", :datetime
   10     end
   11   end
   12 
   13   def self.down
   14     drop_table :events
   15   end
   16 end

Il campo category_id conterrà l’id della categoria a cui associare l’ evento, a differenza del solito, invece di avere una tabella contenente tutte le categorie per poi definire una relazione has_many nei modelli decido di non appoggiarmi al Db e neanche di realizzare un modello di appoggio, ma semplicemente di definire un Array contenente le categorie.

Nel modello Event ho definito un Array CATEGORY_EVENT contente la categoria e il suo id.

    1     CATEGORY_EVENT=[
    2       ["A", 1],
    3       ["B", 2],
    4       ["C", 3], 
    5       ["D", 4], 
    6       ["E", 5]].freeze

Nelle vostre viste potete usare l’implace editing in questo modo:

    1 in_place_select_editor_field(:event, :category_id, {}, {:select_options => Event::CATEGORY_EVENT})

Adesso si definisce la funzione che consente di modificare il record e che rirenderizza il nuovo valore, una funzione del tipo: set_event_category_id.

Beh per farlo ho realizzato un modulo, che potete includere nel vostro application.rb:

    1 module UserDefinedFunction
    2 
    3   def self.append_features(base)
    4     base.extend(ClassMethods)
    5   end
    6 
    7   module ClassMethods
    8     def in_place_select_for(object, attribute, options = {})
    9       class_eval %{
   10         def set_#{object}_#{attribute}
   11           @item = #{object.to_s.camelize.constantize}.find(params[:id])
   12           @item.#{attribute.to_s} = params[:value]
   13           @item.save
   14           render :text => #{options[:select_options]}.rassoc(params[:value].to_i)[0]
   15         end
   16       }
   17     end
   18   end
   19 
   20 end

Chiaramente adesso dovete richiamarla nel controllore degli eventi:

    1 in_place_select_for :event, :category, :select_options => Event::CATEGORY_EVENT.to_json

la funzione in_place_select_for vuole, come quella standard, il modello su cui lavorare e il campo, in questo caso anche l’Array dei valori che riempono la select.

Così viene visualizzato il valore della categoria e salvato l’id. Se un giorno decidete di modificare il nome di una categoira tutti gli eventi ad essa associati non dovranno essere modificati poichè il category_id non è stato variato.

6 Commenti a “In_place_select_editor e Array”

  1. vigosan il 4 March 2007 alle 19:38 dice:

    Please can you upload or sent to me a ZIP file with a full example? This feature is great.

    Many thanks.

  2. duccio il 5 March 2007 alle 02:38 dice:

    Ok Vigosan, i’ll create a rails project with a full example!! let me to prepeare it!
    Thank you, i’m pleasured to help you.

    Duccio

  3. duccio il 5 March 2007 alle 15:30 dice:

    Hi vigosan see this post

  4. vigosan il 7 March 2007 alle 18:59 dice:

    Hi duccio, many thanks !!!

  5. vigosan il 7 March 2007 alle 19:03 dice:

    Duccio,
    I’m download it and test, it works very well.
    Thanks again for your help.

  6. duccio il 7 March 2007 alle 19:05 dice:

    It’s a pleasure!

    Duccio

Scrivi un commento