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

时间:2017-08-08 04:48:08

标签: ruby-on-rails ruby forms

如果我有控制器

class MyController < ApplicationController
  vals = [...]

  def new
    ...
  end

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

如何让两个方法都可以访问“vals”变量?在我的“新”视图中,我想在下拉菜单中使用“vals”变量,但rails给了我错误。当然,我可以将变量复制两次,但这个解决方案不够优雅。

4 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:2)

正如Sebastion提到的一个before_ hook / callback是一种方法,但正如你所提到的那样是一个下拉菜单,我猜它是一个不变的列表,如果是这样我建议也许使用一个常量定义值,可能在它们特定的模型中,或者如果要在许多地方使用,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

答案 2 :(得分:1)

与以前的方法不同(虽然可能只是像Sebastian的解决方案中那样优选实例方法),利用函数和局部变量在ruby中以相同方式调用的事实只写:

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

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

 helper_method :vals

如果你想能够使用vals =&#34来修改val;某些值&#34;

def vals= vals_value
  @vals = vals_value
end

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

答案 3 :(得分:-1)

定义相应的model

例如:

class User < ActiveRecord::Base

  TYPES = %w{ type1 type2 type3 }

end

并以您的形式使用

User::TYPES

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

您可以在应用程序的任何位置重复使用它。