如果我有控制器
class MyController < ApplicationController
vals = [...]
def new
...
end
def create
if save
...
else
render 'new'
end
end
如何让两个方法都可以访问“vals”变量?在我的“新”视图中,我想在下拉菜单中使用“vals”变量,但rails给了我错误。当然,我可以将变量复制两次,但这个解决方案不够优雅。
答案 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"]
您可以在应用程序的任何位置重复使用它。