我在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.erb
和edit.html.erb
中的@restaurant
实例变量,即使show
和edit
方法在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的魔力"。