0

私は現在、新しいユーザーをサイト内で案内するツアー インターフェースに取り組んでいます。多くの TourStops を持つ Tour モデルがあり、それぞれにサイトのセクションに関する情報が含まれています。

基本的に、TourStop の番号が渡されたときに、それが添付されている HTML 要素の正しいクラスとデータ属性を生成する Tour モデルの関数を書きたいと思います。たとえば、

<%= link_to image_tag("new_button.png", tour.stop_data(1), :title => 'Add new asset'), new_asset_path %>

関数を呼び出して次のようなものを返す

def stop_data(order)
     " :class => '#{tour_stops.find_by_order(order).name}', 
       :data => '{:order => order}'"
end

次のような link_to タグを作成します。

<%= link_to image_tag("new_button.png", :class => 'tour_stop_1', 
       :data => {:order => 1}, :title => 'Add new asset'), new_asset_path %>

上記のコードは機能しません。このようなことは可能ですか?そうでない場合、私がとるより良いアプローチは何ですか?

4

1 に答える 1

2

image_tagは 2 つのパラメーターを受け入れます。ソースとオプション ハッシュ。

あなたがやろうとしているのは、戻り値stop_dataをこのオプション ハッシュに絞り込むことです。

これを機能させるには、まず からハッシュを返す必要があります。次に、ソースとオプションのstop_data2 つの引数のみを渡すようにします。image_tag

最初

def stop_data(order)
  { 
    :class => tour_stops.find_by_order(order).name, 
    :data  => { :order => order } # you may need order.to_json
  }
end

2番目:

link_to image_tag("new_button.png", tour.stop_data(1), :title => "Add new asset"), new_asset_path

これは機能するように見えますが、 に 3 つのパラメーターを渡しているため、機能しませんimage_tag

次の場合:

image_tag("new_button.png", :class => "tour_stop_1", :data => { :order => 1 }, :title => "Add new asset")

に 4 つのパラメータを渡しているように見えますimage_tagが、実際には 2 つだけです。Ruby では、メソッドの最後のパラメーターがハッシュの場合、ハッシュのキーと値のペアを中かっこ ( {}) で囲む必要がないため、上記の例は基本的に次の例と同じです。

image_tag("new_button.png", { :class => "tour_stop_1", :data => { :order => 1 }, :title => "Add new asset" })

ここで、ヘルパーを で動作image_tagさせるには、オプションをマージして、1 つのハッシュだけにする必要があります。

link_to image_tag("new_button.png", tour.stop_data(1).merge(:title => "Add new asset")), new_asset_path

繰り返しますが、 を呼び出すときに中括弧を省略しています。これは、merge唯一の (したがって最後の) パラメーターがハッシュであるためです。結果は次と同じです。

tour.stop_data(1).merge({ :title => "Add new asset" })
于 2012-11-03T03:41:30.927 に答える