2017-08-08 16 views
0

私はクラスで定義された変数をRailsフォームに渡すにはどうすればよいですか?

class MyController < ApplicationController 
    vals = [...] 

    def new 
    ... 
    end 

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

は、どのように私は両方の方法にアクセス可能な「ヴァルス」変数コントローラを作ることができている場合は?私の「新しい」ビューでは、「vals」変数をドロップダウンメニューに使用したいが、レールは私にエラーを与えている。もちろん、私は変数を2回コピーすることができますが、この解決法は魅力的ではありません。

答えて

2

Sebastionはbefore_フック/コールバックについて言及していますが、それについては言及していますが、これはドロップダウンメニューのためのものです。変化しないリストであると推測しています。おそらくモデル固有のものであるかもしれません。また、多くの場所で使用される場合、POROは物事をDRYに保つうえでうまくいくでしょう。

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

あなたは、before_*コールバックを使用することができます例えばbefore_action、あなたはインスタンス1のように、あなたのヴァルスが変数に設定この方法、それはあなたの新しいの両方で利用可能であるとメソッドを作成することができます、のようなもの:

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

を:そして、これはまた、あなたが簡単に妥当性チェックのためのモデルでは、たとえば、どこでもそれにアクセスするために、またはあなたがそう望むならビューで、またはコントローラのドロップダウンメニューのオプションを設定することができます

class User < ActiveRecord::Base 

    TYPES = %w{ type1 type2 type3 } 

end 

User::TYPES 

=> ["type1", "type2", "type3"] 
のようなウルの形で使用します。 model

例えば対応で定義

これは、アプリケーション内のどこでも再利用できます。

+0

どのように私の答えとは異なるものがすでに提供されていますか?あなたは質問に新しいものを与えておらず、ちょうど1時間前に与えられた回答とまったく同じ解決策を提供しました。 –

+0

私はあなたの回答を編集したと思います。だから寒さはハイパーを取得しないでください。 :) –

+0

anserは編集されていない、冷やされていて心配しないでください。ちょうどこの答えを通して全く新しいものが追加されていないという事実を指摘してください、そして誰もが同じ答えをどこにでも加えたら、コミュニティとして。 –

1

セバスチャンのソリューションのように、インスタンスメソッドを使用するのが望ましいかもしれませんが、関数とローカル変数が同じ方法で呼び出され、単に書き込むという利点があります。

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

、あなたはコントローラ(ないビュー)上でそれにアクセスすることができるはずです。あなたが同様にあなたの意見でそれをしたい場合は、

def vals= vals_value 
    @vals = vals_value 
end 

に乗りヴァルス=「いくつかの値を」使用してヴァルスを変更することができるようにしたい場合は、コントローラ

helper_method :vals 

の先頭に呼び出すことができますセバスチャンのソリューションのようにintance変数を使用するのが望ましいかもしれませんが、何らかの理由でビューの "@vals"の代わりに "vals"を呼び出すことができれば解決します(たとえば、sendまたは試してください)、これはあなたのためにそれを行うことができるはずです。

関連する問題