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

时间:2015-01-20 03:17:48

标签: ruby-on-rails views partials

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

菜式:

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

在我的提供商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>

这将以下内容输出到页面:

总午餐 - (1) 2015-01-24 - Sophies 2天前创建。

虽然这有效(而且很棒)但我正在试图理解这种行为。具体做法是:

  1. 为什么将此部分放在 lunches 文件夹中(因为它当前)而不是提供程序文件夹?它必须在views / lunches文件夹中吗?

  2. 为什么将渲染调用写成实例变量<%= render @lunches %>与指定文件夹,例如<%= render lunches/lunch %>?为什么不需要声明路径? rails如何将@lunches转录成_lunch.html.erb?

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

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

1 个答案:

答案 0 :(得分:0)

当你试图通过它自己渲染一个活动的记录对象时,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