0

我目前正在开发一个可以在我的网站上引导新用户的旅游界面。我有一个包含许多 TourStop 的 Tour 模型,每个 TourStop 都包含有关网站一部分的信息。

基本上,我想为 Tour 模型编写一个函数——当传递一个 TourStop 的编号时——为它所附加的 HTML 元素生成正确的类和数据属性。例如,我想

<%= 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接受两个参数。一个源和一个选项哈希。

您要做的是将您的返回值从stop_data该选项哈希中压缩。

为了让它工作,你首先需要从 Hash 返回一个 Hash stop_data,其次,确保你只将两个参数传递给image_tag- 源和选项。

首先

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

第二

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

这看起来会起作用,但它不会,因为你将三个参数传递给image_tag.

当您执行以下操作时:

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

看起来您甚至将 4 个参数传递给image_tag,但实际上它们只有两个。在 Ruby 中,当方法的最后一个参数是 Hash 时,不需要将 Hash 键/值对包裹在花括号 ( {}) 中,因此上面的示例与

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

现在,为了让你的助手使用image_tag,你需要合并选项,所以它们只有一个哈希。

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 回答