我可能为我的第一个网站努力了,但我想在(引导程序)导航栏上下拉灵活,并显示已保存工作类别的名称。
这是我在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
欢迎任何提示和帮助,甚至与初始问题无关:)谢谢
答案 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
这一点很重要的原因是,当您调用操作/变量时,您需要将它们视为对象。对于新手来说这很难做到,但是如果你能够理解它,它可以帮助你进行大规模的编码。
-
<强> 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>