如何将类中定义的变量传递给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"] 

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

+0

这与我的答案有什么不同?你没有给出任何新的问题,只是提供了完全相同的解决方案作为一个小时前已经给出的答案... –

+0

我认为你编辑你的答案,我发布我的意见如何直接使用,而无需传递到变量。所以只是不要亢奋。 :) –

+0

anser没有被编辑过,冷却不用担心,只是指出这个答案没有增加任何新东西,如果每个人都在相同的答案处处添加相同的答案,我们有一个不好的时间作为一个社区。 –

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

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

并且您应该可以在控制器(而不是视图)上访问它。如果你想在你的看法,以及你可以在控制器

helper_method :vals 

的开始打电话。如果你希望能够修改使用瓦尔斯=“一些价值”丘壑

def vals= vals_value 
    @vals = vals_value 
end 

考虑可能在Sebastian的解决方案中使用intance变量的帐户是首选,但如果您出于某种原因决定能够在视图上调用“vals”而不是“@vals”(例如,如果您使用send或尝试),那么这应该能够为你做到这一点。