如何从Rails partial _header中使用的模型定义实例变量

时间:2016-04-11 20:08:04

标签: ruby-on-rails

@RequestMapping(value = "/url", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})

我的文章模型中的实例变量用于标题的下拉列表。

application.html.erb
<html>
.
.
.
<body>
  <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
    </div>
</body>
.
.
.
</html>

我是否必须在每个视图中包含@articles = Articles.all,例如:

_header.html.erb 
.
.
<li class="dropdown">
.
.
<%= link_to(@articles.first.source, target: "_blank") do %>
.
.
</li>
.
.

还是有更好的方法?

3 个答案:

答案 0 :(得分:2)

这样做:

class PhotosController < ApplicationController

  before_action :set_articles

  def index 
  end

  def new
  end

  def show 
  end 

  private

  def set_articles
    @articles = Article.approved.all
  end

end

这将在您执行所有操作之前设置 @articles ,因此您不需要重复自己。

答案 1 :(得分:2)

实例变量在类范围内使用。因此您不需要这样做,因为变量在您的控制器类中可用,但是如果您希望它用所有文章填充它,那么您可以将它分成可以在每个方法中调用的函数。更好的想法是使用回调来调用新函数

编辑:感谢@Ed de Almeida他为你做了。

答案 2 :(得分:2)

如果我正确理解了问题,您希望网址的每个页面上的下拉菜单中都显示网址来源。它始终是相同的网址吗?如果是这样,您可以将其定义为常量。您可以使用几种宝石来设置安全的全局变量,例如dotenvfigaro。或者您可以在不同的config / environments / files中定义它 - production.rb和development.rb

config.foo = 'bar'

然后您可以使用

访问它
Rails.application.config.foo

如果它们不是常量,则可以在应用程序控制器中设置before_action。

class ApplicationController < ActionController::Base
  before_action :set_dropdown_articles

  def set_dropdown_articles
    @dropdown_articles = Article.approved.all
  end
end