2014-02-20 37 views
0

感谢较早的答案,我在视图中有以下代码。将另一个对象添加到link_to数组

<%= @miniature.contents.where(miniature_id: @miniature).map { |content| link_to content.miniset.name, content.miniset }.join(", ").html_safe %> 

输出

`Minisetname, Minisetname, Minisetname` 

我希望链接Minisetname使其显示后添加(" x#{content.quantity}")作为

Minisetname (x3), Minisetname (x7), Minisetname (x4) 

我只希望(" x#{content.quantity}")如果content.quantity它追加不为空。

我在一个块的其他地方做这个,但我不能解决如何使用上面的数组。

+0

好像在一个视图层控制器逻辑。 – wurde

+0

@wurde实际上它可能是辅助逻辑,因为微型似乎是模型。 – MCB

+0

我会在发布之前的某个时间点回来,并将大量逻辑移入帮助程序和控制器。我还没有掌握帮手,几乎没有任何内容。 – Ossie

回答

1

首先,假设你已经设定了在你的模型之间的关系通常我真的不明白为什么你应该需要一个where

然后我会构成的代码是这样的:

查看

<%= content_miniset_links_with_quantity(@miniature) %> 

助手

def content_miniset_links_with_quantity(miniature) 
    miniature.contents.map{|content| content_miniset_link_with_quantity(content)}.join(', ').html_safe 
end 

def content_miniset_link_with_quantity(content) 
    string = link_to content.miniset.name, content.miniset 
    string << "(x#{content.quantity})" if content.quantity.present? 
    return string 
end 
+0

以上是给我'未定义的方法'内容'。突出显示行<%miniset_link_with_quantity(content.miniset)%>'。加入'where'返回没有帮助。 – Ossie

+1

对不起,我的坏。我已经更新了代码示例,以便它能够正常工作。 –

+1

令人惊叹。那正是我所追求的。太棒了。我将来一定会使用这样的助手。非常感谢。 – Ossie

0

你只要把他们都在一个字符串后面的link_to

link_to "#{content.miniset.name} #{content.quantity}", content.miniset }.join(", ").html_safe 

只要确保虽然你没有标签的东西,这不是html_safe

编辑:让它看起来很容易。

<ul class="items-list"> 
<% @miniature.contents.where(miniature_id: @miniature).map do |content| %> 
    <li class="item-holder"> 
    <ul class="item-details"> 
    <li class="item-link"><%= link_to content.miniset.name.html_safe, foobar_url(content.miniset.id) %>,</li> 
    <li class="item-quant">(x<%= content.quantity %>)</li> 
    </ul> 
    <li>, 
<%end%> 
</ul> 

请注意,您实际上并不需要div,或者多线做,但这只是更好的风格。哦,第二个div可能更适合跨度,或者两个内部div都可能比span更好,但你明白了。

哦!我只是看着你的状况。所以,这不太可能是必要的(除非内容是你写的一些奇怪的非显而易见的功能)。 @minature.contents将自动加载内部联合关联。

好的,所以这里使用连接。

<% @miniature.contents.where(miniature_id: @miniature).map do |content| %> 
    <%= link_to content.miniset.name, foobar_url(content.miniset.id) %> (x<%= content.quantity %>) 
<% end.join(", ") %> 
+0

这有效,但我真的想让'x#{content.quantity}'出现在链接之后,而不是链接文本。 – Ossie

+1

@WorldOfProper我更新了答案,以更好地反映你的目标。 – MCB

+0

我忘了你可以把div放在一个块中,但是你的代码会在'join(“,”)''之后放入'quantity',我试图在'join(“,”)'但不在链接内。 – Ossie

0

第一件事,不要使用where子句。这是一个糟糕的代码。而且,当你做<%= =>它实际上输出任何东西。您正在使用map函数,它返回array。你应该重新整理,并以这种方式完成你的工作。

<%= @miniature.contents.where(miniature_id: @miniature).map { |content| link_to "#{content.miniset.name} (x#{content.quantity})" , content.miniset if content.quantity.present? }.join(", ").html_safe %> 
+0

为避免使用'where'我必须在控制器中执行此操作吗?是否有可能在链接之后出现'x#{content.quantity}'而不是链接文本? – Ossie