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



我在rails中使用脚手架方法为restaurants创建了一个简单的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_controllers.rb中的@restaurant, Rails自动将控制器中定义的变量连接到视图。例如,restaurant控制器中的index方法:

def index
  @restaurants = Restaurant.all
end

当我在index.html.erb中调用@restaurants时,Rails从索引方法中调出@restaurants以在views中使用。

rails在哪里得到show.html.erbedit.html.erb中的@restaurant实例变量,即使showedit方法在restaurants_controller.rb是空方法?我使用的是Rails 5

因此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

定义的动作上设置实例变量

我不是rails专业人士,所以可能有更好的答案,但我已经学会了不质疑"rails的魔力"。

最新更新