Ruby on rails 在应用程序html.erb中使用控制器变量
对于我的第一个网站,我可能太努力了,但我想在(引导)导航栏上做一个下拉菜单,使其灵活,并显示保存的工作类别的名称 这是我在application.html.erb文件中尝试执行的操作:Ruby on rails 在应用程序html.erb中使用控制器变量,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,对于我的第一个网站,我可能太努力了,但我想在(引导)导航栏上做一个下拉菜单,使其灵活,并显示保存的工作类别的名称 这是我在application.html.erb文件中尝试执行的操作: <ul class="dropdown-menu"> <% @workcategory.each do |workcategory| %> <li><%= workcategory.name%></li> <% end
<ul class="dropdown-menu">
<% @workcategory.each do |workcategory| %>
<li><%= workcategory.name%></li>
<% end %>
欢迎提供任何提示和帮助,即使与最初的问题无关:)谢谢如果我们谈论
索引
操作,那么您只是忘记了使用适当的变量:
<ul class="dropdown-menu">
<% @workcategories.each do |workcategory| %>
<li><%= workcategory.name%></li>
<% end %>
您可以使助手方法在多个类别中工作并使用它。可以直接在application_helper中定义它,或者如果不想使用helper,可以将此代码放在ApplicationController中
class ApplicationController < ActionController::Base
def work_categories
Workcategory.all.order("created_at DESC")
end
helper_method :work_categories
end
class ApplicationController
那么在你看来,
<ul class="dropdown-menu">
<% work_categories.each do |workcategory| %>
<li><%= workcategory.name%></li>
<% end %>
</ul>
如果您想在所有操作中使用它,明智的做法是将其放入应用程序\u controller.rb
before_filter :set_work_categories
def set_work_categoriers
@w_categories = Workcategory.all.order("created_at DESC")
end
这应该行得通
还有一个提示
您可以在您的模型中使用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>
我想这应该可以解决这个问题
application.html.erb
是一个布局,这意味着无论您是否使用Workcategories
控制器,它都会出现
如果要将变量加载到布局中,无论调用哪个控制器,都需要确保@workcategory
变量存在
为此,您通常会将@workcategory
声明放入ApplicationController
(大多数其他控制器从中继承):
这一点很重要的原因是,在调用操作/变量时,需要将它们视为对象。这对于新手来说很难做到,但如果你能集中精力,它将极大地帮助你编写代码
--
2。控制器
从上面开始,您必须记住,控制器实际上只是操纵对象的一种方式
因此,如果您正在调用
@workcategory
,您需要了解对象将来自何处以及如何填充它。您希望worker category执行哪种操作?这就是问题所在。没有任何操作,我希望它位于application.html.erb中。我四处寻找了一些其他的主题,比如建议使用before\u过滤器。但那没有成功。所以现在我被卡住了…这给了我同样的错误。事实上,我以前试过“工作类别”,但它不起作用:)所以问题出在其他地方。谢谢。嘿,我已经尝试了第二个选项,更新。这也没用。我得到了同样的错误。@alexlug,请用您在\u action之前尝试过的确切代码(包括此)更新答案,最后我在\u action:work\u categories private def work\u categories@workcategories=workcategory.all.order(“在描述时创建”)结束。现在我想起来了,你确实发布了一个不错的版本,但是我是一个完全的初学者,我不知道发生了什么,没有正确地使用它。你好。我试过了,它抛出了:main:object的未定义方法'helper\u method'。你把代码添加到apps/controllers/application\u controller.rb了吗?这很奇怪。请参阅:该方法需要在ApplicationController代码中定义。我修改了我的答案来说明这一点。这给了我“nil:NilClass的未定义方法`first'。我已经删除了那条线,回到零级。等我在想我可能没有正确保存它或其他什么……我添加了更改。作为确认,您是否有Workcategory
model中的数据?嘿,是的,谢谢您的帮助。我已经试过了,虽然它不能像我想要的那样工作。现在我/我们知道工作类别未正确保存。当我转到rails控制台并检查时,我有3个工作类别,但它们只是不显示。。。我试过before_过滤器,但仍然没有。有什么想法吗?@alexlug,试试better\u errors
gem for dynamic debugginga最后它是你的答案和Rich的答案的混合:)现在可以了,谢谢!!非常感谢。这是缺失的一部分,在行动之前结合阿米特的代码!非常感谢。
def set_work_categoriers
@w_categories = Workcategory.all
end
<% unless @w_categories.nil? %>
<ul class="dropdown-menu">
<% @w_categories.each do |workcategory| %>
<li><%= workcategory.name%></li>
<% end %>
</ul>
<%end>
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_categories
private
def set_categories
@workcategory = ....
end
end
#config/routes.rb
resources :controller