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

ale*_*lug 5 ruby ruby-on-rails ruby-on-rails-4

对于我的第一个网站,我可能太努力了,但我想在(引导程序)导航栏上创建一个下拉菜单,以保持灵活性,并显示已保存工作类别的名称。

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

  <ul class="dropdown-menu">
    <% @workcategory.each do |workcategory| %>
    <li><%= workcategory.name%></li>
    <% end %>
Run Code Online (Sandbox Code Playgroud)

失败,错误undefined methodeach' for nil:NilClass on the<% @workcategory.each do |workcategory| %>` 行。

这是工作类别控制器:

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
Run Code Online (Sandbox Code Playgroud)

欢迎任何提示和帮助,即使与最初的问题无关:) 谢谢

Ami*_*eka 6

如果你想在你的所有行动中使用它,把它放在你的application_controller.rb.

before_filter :set_work_categories

def set_work_categoriers
    @w_categories =  Workcategory.all.order("created_at DESC")
end
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作。

另外,小费。

您可以default_scope {order(created_at: :desc)}在您的模型中使用WorkCategory.rb

然后你可以像这样使用

def set_work_categoriers
  @w_categories =  Workcategory.all
end
Run Code Online (Sandbox Code Playgroud)

我建议将变量名称更改为 @w_categories,否则它会与您的 @work_categories 名称发生冲突index

在您的application.html.erb文件中,更改

<% unless @w_categories.nil? %>
  <ul class="dropdown-menu">
    <% @w_categories.each do |workcategory| %>
      <li><%= workcategory.name%></li>
    <% end %>
  </ul>
<%end>
Run Code Online (Sandbox Code Playgroud)

我想这应该可以解决问题