Rails:如何跨视图访问模型和控制器数据?

Posted

技术标签:

【中文标题】Rails:如何跨视图访问模型和控制器数据?【英文标题】:Rails: How do you access model and controller data across views? 【发布时间】:2015-01-20 03:17:48 【问题描述】:

我正在创建一个应用程序来为你最喜欢的午餐投票,并且我正在重用从教程 (railstutorial.org) 中学到的代码。我的数据模型中有一个相对简单的层次结构,如下所示:

美食模型:

has_many :providers
validates :name, presence: true, uniqueness: true

Cuisine 有以下列:

: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 视图中,我有以下基本代码:

<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 - Sophis 于 2 天前创建。

虽然这行得通(这很好),但我正在挠头试图理解这种行为。具体来说:

    为什么将这个部分放在 lunches 文件夹中(就像现在一样)而不是提供者文件夹中?它必须在视图/午餐文件夹中吗?

    为什么渲染调用写得像一个实例变量&lt;%= render @lunches %&gt;而不是指定一个文件夹,例如&lt;%= render lunches/lunch %&gt;?为什么根本不需要声明路径? rails 如何将@lunches 转录成 _lunch.html.erb?

    我是否需要在午餐子文件夹中呈现部分内容,或者是否有更简单的方法可以在提供者视图中访问午餐数据?

提前感谢您提出一个简单的问题。我的应用程序正在运行,我只是想了解这种行为。

【问题讨论】:

【参考方案1】:

当您尝试自己渲染一个活动记录对象时,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

【讨论】:

感谢您的解释 - 非常有帮助。我可能会使用更长的等效形式,以便我知道发生了什么。我是否需要始终在午餐路径中呈现它,或者我可以从提供者控制器/视图中“读取”午餐数据? 你能解释一下你的问题吗

以上是关于Rails:如何跨视图访问模型和控制器数据?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

Rails - 相同的模型/控制器,但不同的视图

如何将自定义视图+控制器添加到模型?

(Rails)从不同视图中的控制器访问方法

创建不需要模型的 Rails 视图 + 控制器?

在创建控制器和模型之后(仅)创建 Ruby on Rails 视图