繁体   English   中英

如何将类中定义的变量传递到Rails表单中?

[英]How can I pass in a variable defined in a class into a Rails form?

如果我有控制器

class MyController < ApplicationController
  vals = [...]

  def new
    ...
  end

  def create
    if save
      ...
    else
      render 'new'
    end
  end

如何使两个方法都可以访问“ vals”变量? 在我的“新”视图中,我想对下拉菜单使用“ vals”变量,但是Rails给我错误。 当然,我可以将变量复制两次,但是这种解决方案并不完善。

您可以使用before_*回调,例如before_action ,通过这种方式将vals变量设置为实例1,并使它可用于new和create方法,例如:

class SomeController < ApplicationController
  before_action :set_vals, only: [:new, :create]

  def new
    ...
    # @vals is available here
  end

  def create
    if save
      ...
      # and here
    else
      render 'new'
    end
  end

  private 

  def set_vals
    @vals = [...]
  end
end

正如Sebastion提到的before_ hook / callback是解决它的一种方法,但是正如您提到的是用于下拉菜单的,我想它是一个不变的列表,如果这样的话,我建议也许使用Constant来定义值,也许在特定于模型的模型中,或者如果要在许多地方使用它,PORO可以很好地保持干燥。 然后,这还使您可以轻松地在任何地方访问它,例如在模型中进行验证检查,或者在视图中或如果需要的话在控制器中设置下拉菜单的选项:

class ExampleModel
  DROPDOWN_VALUES = [...].freeze

  validates :some_attr, inclusion: { in: DROPDOWN_VALUES } 
end

class SomeController < ApplicationController
  def new
    # can call ExampleModel::DROPDOWN_VALUES here
  end

  def create
    # also here, anywhere actually
  end
end

与之前的方法不同(尽管像Sebastian的解决方案那样,最好只使用实例方法)是利用以下事实:在ruby中以相同的方式调用函数和局部变量,然后编写:

 def vals
   @vals ||= [...]
 end

并且您应该能够在控制器(而不是视图)上访问它。 如果您也希望在视图上显示它,则可以在控制器的开头调用

 helper_method :vals

如果您希望能够使用vals =“ some value”修改vals

def vals= vals_value
  @vals = vals_value
end

考虑到可能像在塞巴斯蒂安的解决方案中那样使用intance变量是首选,但是如果出于某种原因,如果您决定能够在视图上调用“ vals”而不是“ @vals”(例如,如果使用发送或尝试),那么这应该可以为您做到。

在相应的model定义

例如:

class User < ActiveRecord::Base

  TYPES = %w{ type1 type2 type3 }

end

并以您的形式使用

User::TYPES

=> ["type1", "type2", "type3"]

您可以在应用程序中的任何地方重用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM