2010-09-23 7 views
2

Si une action ressemble à:Comment les rails transmettent-ils des objets à la vue?

def show 
    @post = Post.find(params[:id]) 
end 

Je peux alors faire:

<%= @post.title %> 

Comment passer l'objet à la vue?

Puisque mon action n'a qu'une seule ligne, quelle technique de programmation ou modèle est utilisé pour prendre l'objet @post et le passer à la page vue (modèle)?

Je sais qu'il suppose que la vue sera le même nom que l'action, mais comment fait-elle cela?

+1

vous pouvez toujours lire le code source de rails – ennuikiller

Répondre

3

par exemple comme ceci: nous allons transférer les variables myController aux variables MyView

class MyController 
    def my_action 
     @my_variable = 100 
    end 
end 

class MyView 
    def process_view_with_variables(variables) 
     puts variables.inspect # => [{"@my_variable"=>100}] 
     variables.each do |var| 
      var.each {|name,value| self.instance_variable_set(name,value)} 
     end 
     puts self.instance_variables # => @my_variable 
     # .. view_rendering here 
    end 
end 

# create new view and controller instances 
my_controller = MyController.new 
my_view = MyView.new 

# call my_action method in MyController instance (which will initialized some variables) 
my_controller.my_action 

# let know about instance variables in our controller 
puts my_controller.instance_variables.inspect # => ["@my_variable"] 

# simple array, for store variables (this is like a proxy) 
controller_variables = [] 

# transfer instance variables from controller to proxe 
my_controller.instance_variables.each do |variable| 
    controller_variables << {variable => my_controller.instance_variable_get(variable)} 
end 

# let know which instance variables bow in proxy array 
puts controller_variables.inspect # => [{"@my_variable"=>100}] 

# call method process_view_with_variables which will transfer variables from proxy to view 
my_view.process_view_with_variables(controller_variables) # => [{"@my_variable"=>100}]# 
3

Vous devez d'abord regarder le binding class. Le livre "Metaprogramming Ruby" (fortement recommandé BTW) les résume bien: "Une liaison est un ensemble complet emballé comme un objet.L'idée est que vous pouvez créer une liaison pour capturer la portée locale et le transporter."

Puis un coup d'oeil à la classe ERB devrait répondre à votre question. Cet exemple est directement à partir des documents:

require 'erb' 

    x = 42 
    template = ERB.new <<-EOF 
    The value of x is: <%= x %> 
    EOF 
    puts template.result(binding) 

J'espère que cela aide.

+0

grâce à l'arbitre du livre. – Blankman

Questions connexes