因此,我一直在浏览 ActionView 存在的非常糟糕的文档,特别是select_tag
在从视图文件中调用时才存在的方法。据说,它是这样称呼的:
select_tag name, option_tags, options
文档完全没有提及,name
很少options
提及 ,并且仅通过示例描述了option_tags
将其视为必须从其他函数获得的不透明值的示例。
与往常一样,了解 Rails 的唯一方法是对其进行逆向工程。
所以我尝试直接从 Rails 控制台运行它,这很棘手,因为 Ruby 不允许你调用模块中定义的方法,除非你先创建一个类和一个对象:
class H
include ActionView::Helpers::FormOptionsHelper
include ActionView::Helpers::FormTagHelper
end
H.new.options_for_select ["foo","bar"]
上面的用法options_for_select
来自其他人编写的实际代码。返回值是一个字符串:
"<option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option>"
因此,显然,您应该将返回值(option_for_select
或许多其他相关函数之一,这些函数引入了我不想谈论的复杂性,例如从 ActiveRecord 对象生成 HTML 标记)作为. 除非您将该字符串复制到剪贴板并将其直接粘贴到函数调用中,否则它不会执行您期望的操作:option_tag
select_tag
H.new.select_tag :my_name, "<option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option>"
返回值:
"<select name=\"my_name\" id=\"my_name\"><option value="foo">foo</option>\n<option value="bar">bar</option></select>"
至少这揭示了name
参数的用途。
更奇怪的是,如果您将返回值直接传递给select_tag
而不让它在控制台上打印,则文本不会被转义:
H.new.select_tag :name, H.new.options_for_select(["foo","bar"])
返回值:
"<select name=\"name\" id=\"name\"><option value=\"foo\">foo</option>\n<option value=\"bar\">bar</option></select>"
WTF在这里进行吗?