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 method
each' 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)
欢迎任何提示和帮助,即使与最初的问题无关:) 谢谢
如果你想在你的所有行动中使用它,把它放在你的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)
我想这应该可以解决问题