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

Ruby on rails Rails:如何跨视图访问模型和控制器数据?,ruby-on-rails,views,partials,Ruby On Rails,Views,Partials,我正在创建一个应用程序来为您最喜欢的午餐投票,我正在重用从教程(railstutorial.org)中学到的代码。我的数据模型中有一个相对简单的层次结构,如下所示: 烹饪模式: has_many :providers validates :name, presence: true, uniqueness: true belongs_to :cuisine has_many :lunches validates :name, presence: true, uniquen

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

烹饪模式:

has_many :providers
validates :name, presence: true, uniqueness: true
    belongs_to :cuisine
    has_many :lunches
    validates :name, presence: true, uniqueness: true
    validates :cuisine, presence: true
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
美食有以下栏目:

:id, :name
提供商型号:

has_many :providers
validates :name, presence: true, uniqueness: true
    belongs_to :cuisine
    has_many :lunches
    validates :name, presence: true, uniqueness: true
    validates :cuisine, presence: true
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
它具有以下属性:

:id, :name, :cuisine_id
:id, :date, :liked, :disliked, :provider_id, :lunchscore
午餐模式:

has_many :providers
validates :name, presence: true, uniqueness: true
    belongs_to :cuisine
    has_many :lunches
    validates :name, presence: true, uniqueness: true
    validates :cuisine, presence: true
belongs_to :provider
default_scope -> { order('created_at DESC') }
validates :date, presence: true, uniqueness: true
它具有以下属性:

:id, :name, :cuisine_id
: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>

午餐总数-()
我在午餐文件夹中还有一个名为_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>
    - 创建于20年前。
这将向页面输出以下内容:

午餐总数-(1) 2015-01-24-苏菲两天前创作

虽然这很有效(这很好),但我还是在挠头试图理解这种行为。具体而言:

  • 为什么要将此部分内容放在午餐文件夹(目前的情况)而不是提供者文件夹中?是否必须在“视图/午餐”文件夹中

  • 为什么渲染调用像实例变量
    那样编写,而不是指定文件夹,例如
    ?为什么根本不需要声明路径?rails是如何将@午餐转录到_lunch.html.erb的

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


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

    当您尝试自己呈现一个活动记录对象时,rails通过调用
    to_partial_path
    将该对象转换为partial,默认情况下,这是
    视图/模型/模型
    路径,您可以通过调用类似
    午餐.new.to_partial_path

    如果您尝试渲染单个午餐:
    render@午餐
    它将相当于

    render partial: 'lunches/lunch', locals: {lunch: @lunch}
    
    我不知道它支持使用collection
    render@sunches
    ,但是既然你说它可以工作,我想它可以,在这种情况下,等价物应该是

    render partial: 'lunches/lunch', collection: @lunches, as: :lunch
    

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