Как рельсы передают переменную экземпляра из контроллера в представления?

Я создал простое приложение для рельсов в рельсах, используя метод строительных лесов для restaurants.

Это метод контроллера показа и редактирования для restaurants_controller.rb. Обратите внимание, что это просто пустые методы:

  # GET /restaurants/1
  # GET /restaurants/1.json
  def show
  end

  # GET /restaurants/1/edit
  def edit
  end

Это restaurants/show.html.erb:

<p id="notice"><%= notice %></p>

<%= image_tag @restaurant.image_url %>

<p>
  <strong>Name:</strong>
  <%= @restaurant.name %>
</p>

<p>
  <strong>Address:</strong>
  <%= @restaurant.address %>
</p>
...

и restaurants/edit.html.erb:

<h1>Editing Restaurant</h1>

<%= render 'form', restaurant: @restaurant %>

<%= link_to 'Show', @restaurant, class: "btn btn-link" %> |
<%= link_to 'Back', restaurants_path, class: "btn btn-link" %>

Вот мой вопрос: мое текущее понимание (может быть ошибочным) состоит в том, что мы определяем переменную экземпляра, в данном случае @restaurant в restaurant_controllers.rb, и Rails автоматически связывает переменные, определенные в контроллере, с представлениями. Например, метод index в контроллере ресторана:

def index
  @restaurants = Restaurant.all
end

когда я вызываю @restaurants в index.html.erb, Rails вызывает @restaurants из метода индекса, который будет использоваться в views.

Откуда рельсы получают переменную экземпляра @restaurant в show.html.erb и edit.html.erb, хотя методы show и edit в restaurants_controller.rb являются пустыми методами? Я использую Rails 5.


person Iggy    schedule 05.11.2016    source источник
comment
У вас есть before_action :set_restaraunt в вашем контроллере?   -  person Murad Yusufov    schedule 05.11.2016
comment
Вы используете CanCan с load_and_authorize_resource в контроллере?   -  person David    schedule 05.11.2016


Ответы (1)


Таким образом, рельсы достигают этого, применяя это к сгенерированным лесам.

class TestsController < ApplicationController
 before_action :set_test, only: [:show, :edit, :new, :update, :destroy]

 private

  def set_test
    @test = Test.find(params[:id])
  end
end

эта доза такая же, как и добавление

@test = Test.find(params[:id]) к каждому действию, если вам это не нужно ..

который затем устанавливает переменную экземпляра для действий, определенных before_action

Im no rails pro, так что может быть гораздо лучший ответ на этот вопрос, но я научился не сомневаться в «магии рельсов».

person Shawn Wilson    schedule 05.11.2016
comment
и вы можете сделать то же самое, если вы создадите свой собственный MVC и примените ту же практику, что и выше. - person Shawn Wilson; 05.11.2016