我正在做一个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也是一样。
有人知道为什么会这样吗?
答案 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”。
但是您应该真正考虑在这里使用局部的。