Rails:您如何跨视图访问模型和控制器数据?
Rails: How do you access model and controller data across views?
我正在创建一个应用程序来投票选出你最喜欢的午餐,我正在重用我从教程 (railstutorial.org) 中学到的代码。我的数据模型中有一个相对简单的层次结构,看起来像这样:
菜系型号:
has_many :providers
validates :name, presence: true, uniqueness: true
美食有以下列:
:id, :name
供应商型号:
belongs_to :cuisine
has_many :lunches
validates :name, presence: true, uniqueness: true
validates :cuisine, presence: true
具有以下属性:
:id, :name, :cuisine_id
午餐模式:
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
具有以下属性:
:id, :date, :liked, :disliked, :provider_id, :lunchscore
在我未经训练的眼中,这是一个非常简单的继承模型。我要做的是列出与供应商相关的所有不同午餐,并突出显示他们的分数。
提供商控制器:
def show
@provider = Provider.find(params[:id])
@lunches = @provider.lunches
@cuisine = @provider.cuisine
end
在我的 Provider show.html.erb view 中,我有以下基本代码:
<div class="title"><%= @provider.name.upcase %> </div> <div class="cuisine"> <%= @cuisine.name %> </div>
<div class="span8">
<% if @provider.lunches.any? %>
<h3> Total Lunches - (<%= @provider.lunches.count %>) </h3>
<%= render @lunches %>
<% end %>
</div>
我在 lunches 文件夹中也有一个名为 _lunch.html.erb 的部分,其中包含以下内容:
<ul>
<span class="date_list"> <%= lunch.date %> - <%= @provider.name %> </span>
<span class="timestamp">Created <%= time_ago_in_words(lunch.created_at) %> ago. </span>
</span>
</ul>
这会将以下内容输出到页面:
午餐总数 - (1)
2015-01-24 - Sophies 创建于 2 天前。
虽然这有效(而且很棒),但我正在挠头试图理解这种行为。具体来说:
为什么将此部分放在 lunches 文件夹(目前如此)而不是 provider 文件夹中?它必须在 views/lunches 文件夹中吗?
为什么渲染调用写得像实例变量 <%= render @lunches %>
而不是指定文件夹,例如<%= render lunches/lunch %>
?为什么根本不需要声明路径? rails 如何将@lunches 转录成 _lunch.html.erb?
我是否需要在 lunches 子文件夹中呈现部分内容,或者是否有更简单的方法来访问供应商视图中的午餐数据?
提前感谢您提出一个可能很简单的问题。我的应用程序正在运行,我只是想了解行为。
当您尝试自己呈现活动记录对象时,rails 通过调用 to_partial_path
将该对象转换为部分对象,默认情况下是 view/models/_model
路径,您可以通过调用 Lunch.new.to_partial_path
之类的东西来测试它
如果您尝试渲染单个午餐:render @lunch
它将等同于
render partial: 'lunches/lunch', locals: {lunch: @lunch}
我不知道它支持使用集合 render @lunches
,但既然你说它有效,所以我想它确实有效,在这种情况下,等效项类似于
render partial: 'lunches/lunch', collection: @lunches, as: :lunch
我正在创建一个应用程序来投票选出你最喜欢的午餐,我正在重用我从教程 (railstutorial.org) 中学到的代码。我的数据模型中有一个相对简单的层次结构,看起来像这样:
菜系型号:
has_many :providers
validates :name, presence: true, uniqueness: true
美食有以下列:
:id, :name
供应商型号:
belongs_to :cuisine
has_many :lunches
validates :name, presence: true, uniqueness: true
validates :cuisine, presence: true
具有以下属性:
:id, :name, :cuisine_id
午餐模式:
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
具有以下属性:
:id, :date, :liked, :disliked, :provider_id, :lunchscore
在我未经训练的眼中,这是一个非常简单的继承模型。我要做的是列出与供应商相关的所有不同午餐,并突出显示他们的分数。
提供商控制器:
def show
@provider = Provider.find(params[:id])
@lunches = @provider.lunches
@cuisine = @provider.cuisine
end
在我的 Provider show.html.erb view 中,我有以下基本代码:
<div class="title"><%= @provider.name.upcase %> </div> <div class="cuisine"> <%= @cuisine.name %> </div>
<div class="span8">
<% if @provider.lunches.any? %>
<h3> Total Lunches - (<%= @provider.lunches.count %>) </h3>
<%= render @lunches %>
<% end %>
</div>
我在 lunches 文件夹中也有一个名为 _lunch.html.erb 的部分,其中包含以下内容:
<ul>
<span class="date_list"> <%= lunch.date %> - <%= @provider.name %> </span>
<span class="timestamp">Created <%= time_ago_in_words(lunch.created_at) %> ago. </span>
</span>
</ul>
这会将以下内容输出到页面:
午餐总数 - (1) 2015-01-24 - Sophies 创建于 2 天前。
虽然这有效(而且很棒),但我正在挠头试图理解这种行为。具体来说:
为什么将此部分放在 lunches 文件夹(目前如此)而不是 provider 文件夹中?它必须在 views/lunches 文件夹中吗?
为什么渲染调用写得像实例变量
<%= render @lunches %>
而不是指定文件夹,例如<%= render lunches/lunch %>
?为什么根本不需要声明路径? rails 如何将@lunches 转录成 _lunch.html.erb?我是否需要在 lunches 子文件夹中呈现部分内容,或者是否有更简单的方法来访问供应商视图中的午餐数据?
提前感谢您提出一个可能很简单的问题。我的应用程序正在运行,我只是想了解行为。
当您尝试自己呈现活动记录对象时,rails 通过调用 to_partial_path
将该对象转换为部分对象,默认情况下是 view/models/_model
路径,您可以通过调用 Lunch.new.to_partial_path
如果您尝试渲染单个午餐:render @lunch
它将等同于
render partial: 'lunches/lunch', locals: {lunch: @lunch}
我不知道它支持使用集合 render @lunches
,但既然你说它有效,所以我想它确实有效,在这种情况下,等效项类似于
render partial: 'lunches/lunch', collection: @lunches, as: :lunch