簡體   English   中英

在應用程序html.erb中使用控制器變量

[英]Using a controller variable in application html.erb

我可能對我的第一個網站太努力,但我想在(引導程序)導航欄上下拉靈活,並顯示已保存工作類別的名稱。

這是我在application.html.erb文件中嘗試做的事情:

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

失敗的錯誤undefined method每個'為nil:NilClass on the <%@ workcategory.each do | workcategory | %>`行。

這是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

歡迎任何提示和幫助,甚至與初始問題無關:)謝謝

如果你想在所有的操作中使用它,最好將它放在application_controller.rb

before_filter :set_work_categories

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

這應該工作正常。

還有,小費。

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

那么你可以使用這個,

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>

我想這應該可以解決問題

如果我們談論index操作,那么你只是忘了使用適當的變量:

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

更新

如果你想擁有這一切行動,然后初始化@workcategoriesbefore_action

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

布局

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,是面向對象的

這意味着你所做的一切都應圍繞對象 這就是為什么Rails有許多幫助者似乎“神奇地”工作的原因。

它們根本不是魔術 - 它們只是接受你傳遞的對象 ,並構建預先編寫的HTML以提供特定的功能。

路線就是一個很好的例子:

#config/routes.rb
resources :controller

在此輸入圖像描述

這一點很重要的原因是當你調用actions / variables時,你需要將它們視為對象 對於新手來說這很難做到,但是如果你能夠理解它,它會大大幫助你進行編碼。

-

2.控制器

從上面開始,你必須記住你的控制器實際上只是一種操縱對象的方法。

因此,如果你正在調用@workcategory ,你需要了解對象的來源以及它將如何填充。

您可以創建一個幫助方法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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM