content_tag块中的form_for

时间:2012-05-08 21:22:56

标签: ruby-on-rails ruby-on-rails-3

我在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(不是MessageControllerCommentController)。

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

2 个答案:

答案 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] %>

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

我想这会打败你的方法吗?