2010-05-24 4 views
1

que je fais actuellement ce qui suit, mais il se sent « kludgy »:Quelle est la meilleure façon de gérer content_type dynamique Sinatra

module Sinatra 
    module DynFormat 
     def dform(data,ct) 
      if ct == 'xml';return data.to_xml;end 
      if ct == 'json';return data.to_json;end 
     end 
    end 
    helpers DynFormat 
end 

Mon but est de planifier à l'avance. Actuellement, nous ne travaillons qu'avec XML pour ce service Web particulier, mais nous voulons passer à JSON dès que tous les composants de notre pile le supportent.

Voici un exemple de route:

get '/api/people/named/:name/:format' do 
    format = params[:format] 
    h = {'xml' => 'text/xml','json' => 'application/json'} 
    content_type h[format], :charset => 'utf-8' 
    person = params[:name] 
    salesperson = Salespeople.find(:all, :conditions => ['name LIKE ?', "%#{person}%"]) 
    "#{dform(salesperson,format)}" 
end 

On se sent comme si je ne le fais pas la meilleure façon possible.

Répondre

2

quelques opérations de nettoyage dans l'aide:

  • ajouter cas déclaration
  • ajoutant une valeur par défaut pour le format
  • l'assistant définit maintenant le type de contenu

Code:

module Sinatra 
    module DynFormat 
     CONTENT_TYPES={'xml' => 'text/xml','json' => 'application/json'} 

     def dform(data,format=params[:format]) 
      content_type CONTENT_TYPES[format], :charset => 'utf-8' 
      case format 
      when 'xml' 
       data.to_xml 
      when 'json' 
       data.to_json 
      end 
     end 
    end 

    helpers DynFormat 
end 

sa e I factorise la gestion du type de contenu et supprime la variable temp de la personne puisqu'elle n'est utilisée qu'une seule fois en faveur de l'utilisation des params. Code :

get '/api/people/named/:name/:format' do  
    salesperson = Salespeople.find(:all, :conditions => ['name LIKE ?', "%#{params[:name]}%"]) 
    dform(salesperson) 
end 

du sens, l'air cool?

+0

C'est exactement ce que je cherchais. Je n'étais pas au courant que les params étaient mis à la disposition des assistants. Je suis encore nouveau à Sinatra à cet égard. Je n'ai toujours pas envie d'appeler l'assistant à chaque fois, mais cela va réduire un peu la répétition. Je pense que j'ai une idée pour appliquer automatiquement l'aide maintenant grâce à vous. Je vais tenter le coup. – lusis