Как рельсы передают объекты на вид? - PullRequest
2 голосов
/ 23 сентября 2010

Если действие выглядит так:

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

Тогда я могу сделать:

<%= @post.title %>

Как он передает объект в представление?

Поскольку мое действие имеет только одну строку, какой метод программирования или шаблон используется для получения объекта @post и передачи его на страницу представления (шаблона)?

Я знаю, что предполагается, что представление будет иметь то же имя, что и действие, но как оно это делает?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2010

например, вот так: мы переведем переменные MyController в переменные 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 голосов
/ 23 сентября 2010

Сначала вам нужно взглянуть на класс привязки . Книга «Метапрограммирование Ruby» (очень рекомендуется BTW) хорошо их подытоживает: «Связывание - это целая область, упакованная как объект. Идея состоит в том, что вы можете создать Связывание, чтобы захватить локальную область и перенести ее».

Тогда ответ на класс ERB должен ответить на ваш вопрос. Этот пример прямо из документов:

  require 'erb'

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...