我在module MessagesHelper
中有这个功能:
def message_block( message, ticket, comment )
content_tag( :div, :class => "message", :id => "message-" + message.id.to_s ) do
content_tag( :p, message.body, :class => "message-body", :id => "message-body-" + message.id.to_s ) +
content_tag( :div, content_tag( :a, "add comment", :id => "comment-link-" + ticket.id.to_s, :class => "comment-link" ), :id => "comment-" + ticket.id.to_s, :class => "comment" ) +
form_for( comment, :html => { :class => "add-comment", :id => "add-comment-" + ticket.id.to_s } ) do |f|
f.label :body, "add comment"
f.text_area :body
f.submit "add comment"
end
end
end
获得预期结果:
<div class="message">
<p></p>
<div class="comment">
</div>
<form class="add-comment">
</form>
</div>
在我的部分视图中,_messages.html.erb
:
<% if !@message.nil? %>
<% @message.each do |m| %>
<%= message_block( m, @ticket, @comment ) %>
<% end %>
text_area
甚至没有加载到DOM中,我只能看到add comment
按钮。这一切都在TicketController
(不是MessageController
或CommentController
)。
对我的问题的任何帮助都会很棒。谢谢。
答案 0 :(得分:2)
我想我刚遇到同样的问题。我发现的是助手只返回一个字符串。因此,'f.submit'生成的最后一个输出在你的帮助器中添加注释“'是返回的内容并被放入你的视图模板中。要解决此问题,您需要连接所有字符串输出并在帮助程序末尾返回该大字符串。希望这能解决你的问题。
我认为这是将助手限制为单一输出的惯例。因为否则,部分可能是要走的路。
小心!
答案 1 :(得分:1)
你有一个很难阅读和维护的帮手。我建议你考虑使用partial来实现它。
这是一个例子。假设你想要渲染很多表单,你考虑创建一个帮助器,它接受一些标题,表单对象和要包含在表单中的字段列表。这是解决方案的部分内容。
在views/shared/_render_some_stuff.erb
中创建(请注意开头的下划线):
<%= title %>
<%= form_for object do |f| %>
<% fields.each do |field_name| %>
<%= f.label field_name %>
<%= f.text_field field_name %>
<% end %>
<% end %>
以任何方式“注入”它:
<%= render 'shared/render_some_stuff',
title: 'Hello', object: Product.first, fields: [:title, :price] %>
(注意:这里没有下划线。你只需要它来区分你在目录中的部分,但不是在这里)
我想这会打败你的方法吗?