2017-06-15 11 views
-1

URLで渡されたパラメータに基づいてページを動的にしようとしています。私は、これは単なる文字列を出力し、明らかにこれ可変レールで補間する

<h3><%= "$subproject_title_#{params[:num]}_1" %></h3> 

のような変数を変更するのparamsを使用したいが、私は引用符を削除する場合は、ハーフラインだけでコメントアウトされます。 これを行う適切な方法は何ですか?

  • 動的
  • してみてください、さらにeval

を使用しないでください変数を構築しないグローバル変数

  • を使用しないでください:親指のいくつかのルールが

  • +0

    'public_send( "$のsubproject_title _#{のparams [:NUM]} _ 1")' –

    +0

    @AndreyDeineko私に未定義のメソッドエラーを与えます。 – JustusP

    +0

    グローバルではなくインスタンス変数を使用できますか? –

    答えて

    -2
    eval("$subproject_title_#{params[:num]}_1") 
    
    +1

    'eval'は非常に強力なツールです。あなたがしていることを本当に知っていなければ、あなたはそれを避けるべきです。その特定のコードはコードインジェクションに対して脆弱です。たとえば、 ':num'を' '"; _1 = 'ls';" ''に設定すると、あなたのビューはディレクトリリストを出力します。 – Stefan

    3

    あなたのビューでparamsにアクセスすることを避けるために、それはコントローラで処理する必要があります。

    グローバル変数の代わりに、インスタンス変数を使用できます。それらはあなたのコントローラとあなたのビューの間で共有されます。代わりにevalの、あなたが与えられたnumの値を取得するためにHash#fetchを使用することができ、その後

    @titles = { 
        '1' = 'title one', 
        '2' = 'title two', 
        '3' = 'title three', 
    } 
    

    :代わりに、動的に生成された変数の

    、あなたはハッシュを使用することができます。

    あなたのコントローラ内でインスタンス変数にその値を割り当てることができます。

    def index 
        @title = @titles.fetch(params[:num], 'default title') 
    end 
    

    インスタンス変数は、あなたの中に表示アクセスできること:

    <h3><%= @title %></h3> 
    

    あなたはまたPageを作成することができますモデルにtitleと(ユニークな)numという属性を付けてページの詳細を保存します。お使いのコントローラへの変更は非常に簡単になります:

    def index 
        @page = Page.find_by(num: params[:num]) 
    end 
    

    そして、あなたのビューで:

    <h3><%= @page.title %></h3>