rails如何将实例变量从控制器传递到视图?

时间:2016-11-05 17:52:51

标签: ruby-on-rails instance-variables

我使用restaurants的搭建方法在rails中创建了一个简单的rails应用程序。

这是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自动连接控制器中定义的变量观点。例如,餐厅控制器中的索引方法:

def index
  @restaurants = Restaurant.all
end

当我在@restaurants中呼叫index.html.erb时,Rails会从@restaurants中使用的索引方法中调出views

即使@restaurant中的show.html.erbedit.html.erb方法为空,rails也会在showedit中获取restaurants_controller.rb实例变量方法?我正在使用Rails 5。

1 个答案:

答案 0 :(得分:0)

所以rails通过将其应用于生成的支架来实现这一点

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,所以可能有更好的答案,但我学会了不要质疑“rails magic”。