1

我有这个功能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 %>

甚至没有加载到 DOM中text_area,我只能看到add comment按钮。这都在TicketController(不是MessageControllerCommentController)中。

对我的问题有任何帮助都会很棒。谢谢你。

4

2 回答 2

2

我想我刚刚遇到了同样的问题。我发现助手只返回一个字符串。因此,在您的帮助程序中由 'f.submit "add comment"' 生成的最后一个输出是返回的内容并被放入您的视图模板中。要解决此问题,您需要连接所有字符串输出并在帮助程序末尾返回该大字符串。希望这能解决您的问题。

我认为这是将助手限制为单个输出的惯例。因为否则,部分可能是要走的路。

小心!

于 2012-05-09T01:18:37.947 回答
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] %>

(注意:这里开头没有下划线。你只需要它来区分你在目录中的部分,但这里不是)

我想它打败了你的方法?

于 2012-05-08T21:47:10.913 回答