如何将类中定义的变量传递给Rails表单?
问题描述:
如果我有一个控制器如何将类中定义的变量传递给Rails表单?
class MyController < ApplicationController
vals = [...]
def new
...
end
def create
if save
...
else
render 'new'
end
end
我怎样才能使“丘壑”变量都可以访问的方法呢?在我的“新”视图中,我想使用“vals”变量作为下拉菜单,但是rails会给我提供错误。当然,我可以将变量复制两次,但这种解决方案不够优雅。
答
由于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
答
你可以使用一个before_*
回调,例如before_action
,这样你将你的丘壑变量作为实例之一,并使其可用于您的新的和创建方法,是这样的:
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
答
限定在相应model
例如:
class User < ActiveRecord::Base
TYPES = %w{ type1 type2 type3 }
end
和在乌尔形式使用像
User::TYPES
=> ["type1", "type2", "type3"]
您可以在应用程序的任何位置重复使用。
答
与以前不同的方法(虽然可能只是在Sebastian的解决方案中只有实例方法是优选的),但是要利用以下事实:函数和局部变量在ruby中以相同的方式调用并写入:
def vals
@vals ||= [...]
end
并且您应该可以在控制器(而不是视图)上访问它。如果你想在你的看法,以及你可以在控制器
helper_method :vals
的开始打电话。如果你希望能够修改使用瓦尔斯=“一些价值”丘壑
def vals= vals_value
@vals = vals_value
end
考虑可能在Sebastian的解决方案中使用intance变量的帐户是首选,但如果您出于某种原因决定能够在视图上调用“vals”而不是“@vals”(例如,如果您使用send或尝试),那么这应该能够为你做到这一点。
这与我的答案有什么不同?你没有给出任何新的问题,只是提供了完全相同的解决方案作为一个小时前已经给出的答案... –
我认为你编辑你的答案,我发布我的意见如何直接使用,而无需传递到变量。所以只是不要亢奋。 :) –
anser没有被编辑过,冷却不用担心,只是指出这个答案没有增加任何新东西,如果每个人都在相同的答案处处添加相同的答案,我们有一个不好的时间作为一个社区。 –