![](/img/trans.png)
[英]Ruby on rails: using javascript variable in <%= %> tags in 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 %>
更新
如果你想擁有這一切行動,然后初始化@workcategories
在before_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.