2017-07-11 1 views
0

Sous le code sont écrits dans l'action du contrôleur où nous générons une action différente basée sur le paramètre d'action et secondaire, nous générons seulement le réponse xml sur la base de différents paramètres d'action.Il n'est pas nécessaire que chaque cas d'action consiste en balise de résultat en tant que parent.Il varie entre action à l'action.Quelle est la meilleure façon de mettre en œuvre l'action générique du contrôleur où différentes réponses générées basées sur les paramètres

doc = EncodeDecode.decode(request.raw_post) 
action = parse_xml(doc/'action') if (doc/'action').first 

# action = 'fetch_thread_colors' 
case action 
when 'create_customer_profile' 
    result = Customer::CustomerCrud.create_customer_profile(doc) 
    render :xml => "<result>#{result}</result>" 

when 'create_customer_payment_profile' 
    result = Customer::CustomerCrud.create_customer_payment_profile(doc) 
    render :xml => "<result>#{result}</result>" 

Comment nous pouvons atteindre la meilleure façon de mettre en œuvre parce que mon problème est qu'il est à grand en terme de ligne de codes Je rencontrais plus de 300-350 cas dans le commutateur block.Is-il quelque chose comme je peut l'atteindre en utilisant la métaprogrammation Mais nous devons également considérer le point de mémoire efficace.

Les solutions doivent être efficaces, propres et optimisées pour la mise en œuvre.

Toute approche orientée objet peut également m'aider.

+2

Veuillez préciser les exigences et ajouter d'autres exemples à votre question. Il est très frustrant d'écrire une réponse et on se fait ensuite dire que la réponse ne peut pas gérer les cas marginaux inconnus. Personne ne pourra vous aider si vous n'ajoutez pas tous les détails importants à votre question. – spickermann

Répondre

0

Vous pouvez utiliser quelque chose comme ça

module Customer 
    class Result 
    def initialize(result) 
     @result = result 
    end 

    def to_xml 
     "#{@result}" 
    end 
    end 

    class WrappedResult < Result 
    def to_xml 
     "<result>#{@result}</result>" 
    end 
    end 

    class CreateCrud 
    def self.create_profile(doc) 
     WrappedResult.new(true) 
    end 

    def self.create_payment_profile(doc) 
     Result.new(false) 
    end 
    end 

    class UpdateCrud 
    def self.update_profile(doc) 
     WrappedResult.new(true) 
    end 
    end 
end 

# in your controller 
def render_view(result) 
    "template xml" 
end 

def method_for_action(action_string) 
    @actions ||= { 
    "create_customer_profile" => Customer::CreateCrud.method(:create_profile), 
    "create_customer_payment_profile" => Customer::CreateCrud.method(:create_payment_profile), 
    "update_customer_profile" => Customer::UpdateCrud.method(:update_profile), 
    "defaultacctcategory" => Proc.new do |doc| 
     # do stuff 
     Customer::Result.new(render_view(doc)) 
    end 
    } 

    @actions[action_string] 
end 

puis l'utiliser comme

method_for_action("create_customer_payment_profile").call(doc).to_xml 
#=> "false" 
method_for_action("create_customer_profile").call(doc).to_xml 
#=> "<result>true</result>" 
method_for_action("update_customer_profile").call(doc).to_xml 
#=> "<result>true</result>" 
method_for_action("defaultacctcategory").call(doc).to_xml 
#=> "template xml" 

doc = EncodeDecode.decode(request.raw_post) 
action = parse_xml(doc/'action') if (doc/'action').first 

result = method_for_action("defaultacctcategory").call(doc) 
render xml: result 

Cela vous permet de protéger toutes les méthodes en regard du public, mais non publiques dans la classe par liste blanche ce qui peut être appelé. Il encapsule ensuite le résultat dans une instance de Result ou WrappedResult sur une méthode par cas de méthode, selon si vous avez besoin de la balise <result> d'encapsulation. L'inconvénient est que vous enveloppez maintenant votre résultat dans un nouvel objet (si ce n'était pas déjà une classe) qui a to_xml, donc si vous avez du code qui comptait dessus, vous devriez mettre à jour et ajuster .

+0

Je suis un peu confus ... votre code peut m'aider ou pas alors pouvez-vous s'il vous plaît m'aider comment je peux intégrer intégrer si l'action est juste comme ci-dessous où il n'y a pas de résultat de xml et tous –

+0

quand 'defaultacctcategory' gl_account = :: GlAccount.find_by_trans_flag_and_acct_flag grand livre ('A', 'T') acc_category = :: GlCategory.find_all_by_id grand livre (gl_account.gl_category_id) render_view (acc_category, 'gl_category', 'L') –

+0

@TusharPal donc, ce méthode parfois ne rend pas du tout XML? Ou render_view rend-il XML via d'autres moyens? –