Ruby on rails 为什么我在控制器外部使用全局vauiable时,在使用select_标记时返回一个对象?

Ruby on rails 为什么我在控制器外部使用全局vauiable时,在使用select_标记时返回一个对象?,ruby-on-rails,ruby,ruby-on-rails-4,model-view-controller,Ruby On Rails,Ruby,Ruby On Rails 4,Model View Controller,当我尝试在控制器外部使用全局变量时,它会返回一个对象 我使用的是祖先宝石,我想返回所有节点中的所有子节点,以便用户只能选择子类别 这是我的控制器代码 def new @product = current_user.products.build $categories = Category.all.map{ |c| [c.name, c.id] } @main = [] Category.all.each do |category| if category.paren

当我尝试在控制器外部使用全局变量时,它会返回一个对象 我使用的是祖先宝石,我想返回所有节点中的所有子节点,以便用户只能选择子类别 这是我的控制器代码

def new
@product = current_user.products.build
    $categories = Category.all.map{ |c| [c.name, c.id] }
    @main = []
   Category.all.each do |category|
    if category.parent_id.nil?
     next
      else
     @main << category
    end 
    end
   $subcat = @main.map{ |c| [c.name, c.id] }
   end
def新建
@产品=当前用户.products.build
$categories=Category.all.map{| c |[c.name,c.id]}
@main=[]
Category.all.each do | Category|
如果category.parent\u id.nil?
下一个
其他的
@主要
“选择类别”)%%>

当我在categories_控制器中使用控制器代码时,它不断返回and对象,而不是返回类别名称

在任何其他循环或函数中,当我在任何其他控制器中使用它时,它表现正常,并且它返回了我期望的结果,但使用select_标记时除外

所以我可以把它放在数组中,返回它并显示它,但我不能使用select_标记,因为它将返回一个对象

所以我必须把它放在产品控制器,新的行动

在任何其他地方,它将返回一个对象,即使在应用程序控制器中,即使它是一个全局变量,我应该能够在任何地方使用它

那么为什么选择标签会这样做呢

另一个问题是,当我使用实例变量时,它也不起作用


谢谢

您不应该使用全局变量。在我9年的rails工作经验中,我只遇到过一种情况,当时一切正常。对你来说,这绝对不好

我建议你做什么:

在类别模型中定义子类别范围:

class Category < ActiveRecord::Base
  scope :subcategories, -> { where.not(parent: nil) }
end
将视图中的“选择”的“选项”替换为“选择”的“集合”中的“选项”:

<div class="form-group">
<%= f.label t('category'), :class => 'control-label col-lg-2-offset' %>
<div class="col-lg-10-offset">
  <%= select_tag(:category_id, options_from_collection_for_select(Category.subcategories, :id, :name), prompt: "Select Category") %>
</div>
<%=f.error_span(:category_id) %>

'控制标签col-lg-2-offset'>

永远不要使用全局变量。在我9年的rails工作经验中,我只遇到过一种情况,当时一切正常。对你来说,这绝对不好

我建议你做什么:

在类别模型中定义子类别范围:

class Category < ActiveRecord::Base
  scope :subcategories, -> { where.not(parent: nil) }
end
将视图中的“选择”的“选项”替换为“选择”的“集合”中的“选项”:

<div class="form-group">
<%= f.label t('category'), :class => 'control-label col-lg-2-offset' %>
<div class="col-lg-10-offset">
  <%= select_tag(:category_id, options_from_collection_for_select(Category.subcategories, :id, :name), prompt: "Select Category") %>
</div>
<%=f.error_span(:category_id) %>

'控制标签col-lg-2-offset'>

利用ruby的继承链。您可以在所有控制器的某个父类上将其定义为常量,通常为ApplicationController 样品

class ApplicationController < ActionController::Base
  BASE_URL = "www.url.com/something/"
end
class ApplicationController
然后它将对所有is子级可用,即
PostsController

要将变量从控制器传递到视图,应使用实例变量(@)或全局类变量(@)


最好的选择是实例变量(@)

利用ruby的继承链。您可以在所有控制器的某个父类上将其定义为常量,通常为ApplicationController 样品

class ApplicationController < ActionController::Base
  BASE_URL = "www.url.com/something/"
end
class ApplicationController
然后它将对所有is子级可用,即
PostsController

要将变量从控制器传递到视图,应使用实例变量(@)或全局类变量(@)


您最好的选择是实例变量(@)

我们能看到对象吗?您指的是哪个对象?类别和产品对象是普通的脚手架对象没有什么奇怪的我们能看到对象吗?你是说哪个对象?Category和Product对象是普通的scaffold对象—没有什么特别之处—他希望在父对象不是nil的数组中添加类别。在您的范围内,您需要
范围:子类别,->{where.not(parent:nil)}
代替感谢您的回复,它确实有帮助,但是它没有回答我的问题,为什么我在使用此函数select_标记时无法遍历全局变量?您是否尝试过使用调试器并检查此全局变量是否在视图的上下文中定义?它已定义,我可以在除select_标记之外的任何位置检索它?您能否提供有关您的问题的更多详细信息?我明白了,当您获取category对象时,您希望获取category名称,但是在哪里会发生这种情况呢?在“选择显示值”中?提交表单时是否在请求参数中?或者在哪里?从你的问题看不明显,他希望在父项不是零的数组中添加类别。在您的范围内,您需要
范围:子类别,->{where.not(parent:nil)}
代替感谢您的回复,它确实有帮助,但是它没有回答我的问题,为什么我在使用此函数select_标记时无法遍历全局变量?您是否尝试过使用调试器并检查此全局变量是否在视图的上下文中定义?它已定义,我可以在除select_标记之外的任何位置检索它?您能否提供有关您的问题的更多详细信息?我明白了,当您获取category对象时,您希望获取category名称,但是在哪里会发生这种情况呢?在“选择显示值”中?提交表单时是否在请求参数中?或者在哪里?从你的问题上看不明显