Ruby on Rails 存在一些问题,即使花费数小时尝试也无法解决。我希望你们能帮助我。这四个问题在行首标有 Q1-Q4。
我认为我需要不止一次的元素。出于这个原因,lib 文件夹中应该有一个单独的模块(所以我也可以在其他项目中使用它)。
我需要什么: - 我可以从任何视图自动调用的辅助方法。- 因为它需要更多的 html 东西,所以我想使用一个 html 文件,我在 helper-method 中呈现它。- 将参数传递给 javascript 文件。- 如果使用元素,则必须包含 JavaScript 文件 - 如果使用元素,则必须包含 CSS 文件
由于不太容易理解我的意思,我再用一个简单的例子来解释一下(这只是一个例子,所以不要过多考虑它的含义):Helper for create a combo box with a view- helper 或者使用 javascript 方法。显然,我需要 (html) - 一个放置在下拉框 (js) 顶部的文本输入字段 - 一个在文本框中显示下拉框的选定项目的函数。(css) - 位于下拉列表前面的文本框的样式。(settings) - 一个初始化元素的设置文件,以便我可以在任何地方自动使用它。
我想象的文件夹结构:
- 库
- 组合框
- combo_box_helper.rb
- _combo_box.html.erb
- 组合框.js
- 组合框.css
- 组合框
在 combo_box-helper.rb 我有 2 方法:
- 组合框字段(下拉内容)
该方法使用部分返回一个组合框。数组条目在下拉框中可用。
- combo_box_js(drop_down_content)
当使用 javascript 创建组合框时,必须调用该方法。要仅对组合框进行一次更改,还应使用部分创建元素并将其传递给 javascript。
这里出现了第一个问题:
Q1:在任何方法的第一次调用(并且仅在第一次调用)时,它必须包含 js 和 css 文件。这样做的常见方法是什么?
Q2:如何渲染位于 lib 文件夹中而不是 app/view 文件夹中的部分?
Q3:给javascript传参数的常用方法是什么?
我的第一次尝试:
module ComboBoxHelper
def combo_box_field(drop_down_content)
output = check_first_call
output + render(:partial => 'combo_box', :locals => {:content => drop_down_content})
end
def
output = check_first_call
output + "<div class='hidden' data-combobox = '" + render(:partial => 'combo_box', :locals => {:content => drop_down_content}) + "'></div>"
end
def check_first_call
if @already_called
""
else
@already_called = true
javascript_include_tag("combo_box.js") + stylesheet_link_tag("combo_box.css")
end
end
end
问题:
- 渲染方法不起作用(它在应用程序/视图中搜索部分)
- check_first_call 的调用很丑陋。特别是当它返回一个字符串时。
- javascript 和 css 的包含不起作用(文件不在资产管道中)
.html.erb 和 .css 文件的内容是不言自明的。javascript 文件中有趣的部分是我尝试访问 Ruby on Rails 传递的参数:
$('div.hidden[data-combobox]').data("combobox")
如果这些问题都解决了,只有一件事很重要:如何正确初始化模块,所以我到处自动使用它。
我的第一次尝试:我使用该代码在 config/initializers/init_combo_box 文件夹中创建一个文件:
require_dependency 'combo_box/combo_box_helper'
ActiveSupport.on_load(:action_view) do
include ComboBoxHelper
end
Q4 : 这是常见的方式吗?我是否需要添加一些内容来解决上述问题之一(例如,将 js- 和 css 文件添加到资产管道)?
谢谢你的帮助。