在应用程序html.erb中使用控制器变量

时间:2015-10-14 10:10:29

标签: ruby-on-rails ruby ruby-on-rails-4

我可能为我的第一个网站努力了,但我想在(引导程序)导航栏上下拉灵活,并显示已保存工作类别的名称。

这是我在application.html.erb文件中尝试做的事情:

  <ul class="dropdown-menu">
    <% @workcategory.each do |workcategory| %>
    <li><%= workcategory.name%></li>
    <% end %>

对于nil,每个错误undefined method失败:NilClass on the&lt;%@ workcategory.each do | workcategory | %&gt;`line。

这是workcategories控制器:

class WorkcategoriesController < ApplicationController
    before_action :find_workcategory, only: [:edit, :update, :destroy]
    def index
        @workcategories = Workcategory.all.order("created_at DESC")
    end
    def new
        @workcategory = Workcategory.new
    end
    def create
        @workcategory = Workcategory.new(post_params)
        if @workcategory.save
            flash[:notice] = "Workcategory created"
            redirect_to(:action=>'index', :workcategory_id => @workcategory.id)
        else
            @workcategories = Workcategories.order()
            render('new')
        end
    end

    def edit
    end

    def update
    end

    def destroy
        @workcategory.destroy
        redirect_to workcategory_path
    end
    private
    def find_workcategory
        @workcategory=Workcategory.find(params[:id])
    end
    def post_params
        params.require(:workcategory).permit(:name)
    end
end

欢迎任何提示和帮助,甚至与初始问题无关:)谢谢

4 个答案:

答案 0 :(得分:4)

如果您想在所有操作中使用它,最好将其放在application_controller.rb中。

before_filter :set_work_categories

def set_work_categoriers
    @w_categories =  Workcategory.all.order("created_at DESC")
end

这应该可以正常工作。

另外,小费。

您可以在模型default_scope {order(created_at: :desc)}

中使用WorkCategory.rb

然后你可以使用它,

def set_work_categoriers
  @w_categories =  Workcategory.all
end

我建议将变量名称更改为@w_categories,否则它会与index操作中的@work_categories名称冲突。

application.html.erb文件中,更改

<% unless @w_categories.nil? %>
  <ul class="dropdown-menu">
    <% @w_categories.each do |workcategory| %>
      <li><%= workcategory.name%></li>
    <% end %>
  </ul>
<%end>

我想这应该可以解决问题

答案 1 :(得分:2)

如果我们谈论index行动,那么您只是忘了使用适当的变量:

<ul class="dropdown-menu">
  <% @workcategories.each do |workcategory| %>
  <li><%= workcategory.name%></li>
<% end %>

<强>更新

如果您想在所有操作中使用此功能,请在@workcategories中初始化before_action

# your_controller.rb
before_action :initialize_work_categories
def initialize_work_categories
  @workcategories = Workcategory.all.order("created_at DESC")
end

答案 2 :(得分:2)

<强>布局

application.html.erb布局,这意味着无论您是否使用Workcategories控制器,它都会出现。

如果要将变量加载到布局中,无论调用哪个控制器,都需要确保@workcategory变量存在。

为此,您通常会将@workcategory声明放入ApplicationController(大多数其他控制器继承):

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
   before_action :set_categories

   private

   def set_categories
      @workcategory = ....
   end
end

这是填充布局方变量的标准方法。如果您的控制器继承自Application控制器,它效率不高,有效。

其他一些指示包括以下内容:

<强> 1。面向对象

Ruby,就Rails来说,是object orientated

这意味着您所做的一切都应围绕对象。这就是为什么Rails有许多帮助者似乎“神奇地”工作的原因。

它们根本就不是魔术 - 它们只需要传递它们的对象,并构建预先编写的HTML以便为您提供特定的功能。

一个很好的例子是routes

#config/routes.rb
resources :controller

enter image description here

这一点很重要的原因是,当您调用操作/变量时,您需要将它们视为对象。对于新手来说这很难做到,但是如果你能够理解它,它可以帮助你进行大规模的编码。

-

<强> 2。控制器

从上面开始,你必须记住你的控制器实际上只是一种操纵对象的方法。

因此,如果你正在调用@workcategory,你需要了解对象的来源以及它将如何填充。

答案 3 :(得分:0)

您可以使用辅助方法work_categories并使用它。可以直接在application_helper中定义它 - 或者如果您不想使用帮助程序,可以将此代码放在ApplicationController中

class ApplicationController < ActionController::Base

  def work_categories
    Workcategory.all.order("created_at DESC")
  end
  helper_method :work_categories

end

然后在你看来:

<ul class="dropdown-menu">
  <% work_categories.each do |workcategory| %>
    <li><%= workcategory.name%></li>
  <% end %>
</ul>