为什么在辅助函数[Rails]

时间:2018-07-17 15:55:16

标签: ruby-on-rails ruby frontend

我正在做一个Rails项目,并重新编写一些代码。因为我将相同类型的collection_select与form_tag一起使用,所以我决定为其创建一个帮助器,只需更改路径和请求即可。

但是,我注意到当我在辅助函数中使用form_for时,它仅返回最后一行。在下面的示例中,它将仅返回提交按钮,而如果我删除了提交按钮,则将仅返回选择。

def form_select #### Helper Function
     form_tag po_path(@pos), method: "get" do 
         collection_select :po, :category, @pos.categories.order(:id), :id, :name, selected: (@items.empty? ? "" : @items.first.category.id)
         submit_tag "Show items" 
     end 
  end 
end 

我的问题是;为什么这不起作用,但是以下原因呢?

<!-- In the view -->
<%= form_tag po_path(@pos), method: "get" do %> 
        <%= collection_select :po, :category, @pos.categories.order(:id), :id, :name, selected: (@items.empty? ? "" : @items.first.category.id)%> 
        <%= submit_tag "Show items" %> 
    <% end %>

对于form_for也是一样。

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

在helper方法中调用表单帮助器(或任何其他html帮助器)时,您需要调用concat(或手动连接字符串)。

def form_select #### Helper Function
  form_tag po_path(@pos), method: "get" do 
    concat collection_select :po, :category, @pos.categories.order(:id), :id, :name, selected: (@items.empty? ? "" : @items.first.category.id)
    concat submit_tag "Show items" 
  end 
end 

这是因为帮助程序没有按预期返回连接的html字符串。就像其他Ruby块一样,这些块返回最后一个表达式的结果。

def foo(&block) 
  yield
end

# returns "baz"
foo do
  "bar"
  "baz"
end

它在ERB中有效,因为<%= %> are expressions的渲染器在渲染模板时应使用代码的结果(作为字符串)替换代码元素。这有点像puts,但它会写入模板缓冲区。

<%= foo do %>
  <%= "bar" %> <%= "baz" %>
<% end %>

此示例将向模板输出“ bar baz”。

但是您应该真正考虑在这里使用局部的。