2016-09-08 7 views
0

私はいくつかのコードをリファクタリングしています。私はテーブルの列を作るforループの一部として私のビューで配列を使用しようとしています。Ruby on Rails:変数に配列の値を格納し、文字列として使用する

私は私のコントローラで配列を定義しています

subjects_controller.rb

def index 
    ... 
    @CRFS_TO_VIEW = [Baseline, TreatmentCompletion] 
    @CRF_PATH = {Baseline => 'baseline_path', TreatmentCompletion => tc_path} 
end 

だから私の目標は、関数が@CRFS_TO_VIEWを反復するので、正しいパスが@CRF_PATHから選択され、link_to関数に追加されます。

indext.html.erb

<% @CRFS_TO_VIEW.each do |crf| %> 
    <% path = @CRF_PATH[crf] %> 
    <%= link_to "edit", path(crf.where(subject_id: sub.subject_id).first %> 
<% end %> 

私も試してみました:

動作しませんでした
<%= link_to "edit", @CRF_PATH[crf](crf.where(subject_id: sub.subject_id).first %> 

を。私は近くになっていなければならないと感じています。どんな助けや洞察も大変ありがとうございます。

ありがとうございました。

+0

は '@ CRFS_TO_VIEW'配列にあり、要素は文字列ではないでしょうか? @CRFS_TO_VIEW = ['Baseline'、 'TreatementCompletion'] 'のようなものです。 '@ CRF_PATH'と同じです。 – treiff

+0

そうかもしれないが、私は確かにそれを試してみるだろう。しかしその前に、@ CRF_PATH [crf]をパスに保存することはできません。パスは識別されません。ビュー内に変数を宣言できないのでしょうか? –

+0

したがって、アイテムは文字列ではないため、@ CRFS_TO_VIEWは機能しません。それらはコントローラへの参照です。そのようなBaseline.create(id)は動作するはずです。 –

答えて

2

いくつかのこと:

。いくつかの時間を節約し、配列の代わりに辞書をループする必要があります:

<% @CRF_PATH.each do |crf, path| %> 
... 
<% end %> 

b。あなたはループから文字列を取得している - あなたはsendと同等のメソッドを呼び出すことができます。

<%= send(path, ...) %> 

C。

crf.find_by(subject_id: sub.subject_id) 

これは非常に悪いやり方だと思われますが、次のようにオブジェクトの取得を簡略化することができます。私はビューヘルパーの追加の代わりにお勧めしたい:あなたが使用することができ、このようなもので

def crf_path(crf) 
    case crf 
    when Baseline then baseline_path(crf) 
    ... 
end 

を(通知は、同様の安全のためにfind_by!find_byを変更):

<% @CRFS_TO_VIEW.each do |crf| %> 
    <%= link_to "edit", crf_path(crf.find_by!(subject_id: sub.subject_id) %> 
<% end %> 

最後にインスタンス変数べきはありません名前は大文字で指定してください。定数を使用する場合は定数として定義します(そうでない場合は小文字の名前を使用します)。

+0

これは非常に役に立ちます。私はそのような方法でビューヘルパーを使用できるとは思っていませんでした。私はこれが私が探していた答えだと思う、私はこれで少し時間を費やし、おそらくあなたに質問を2つ質問する。本当にありがとう。 –

+0

これらのビューヘルパーは、レール4.0以上のものですか?または、より良い質問、どこに助手を置くのですか? –

+0

@IanEllisそれらを 'app/helpers/application_helper.rb'の下に置くことができます。 –

関連する問題