Ruby on Rails存在一些问题,即使花费数小时和数小时尝试也无法解决。我希望你们能帮助我。这四个问题在行尾开始标记为Q1-Q4。
我在视图中有一个元素,我需要不止一次。因此,lib文件夹中应该有一个单独的模块(所以我也可以在其他项目中使用它)。
我需要什么: - 一个帮助方法,我可以从任何视图自动调用。 - 因为它需要更多的html东西,我想使用一个html文件,我在helper-method中渲染。 - 将参数传递给javascript文件。 - 如果使用该元素,则必须包含JavaScript文件 - 如果使用该元素,则必须包含CSS文件
由于不容易理解我的意思,我将用一个简单的例子再次解释它(这只是一个例子,所以不要过多考虑它的意思):Helper用于创建一个组合框视图助手或者使用javascript方法。 显然,我需要 (html) - 放置在下拉框顶部的文本输入字段 (js) - 在文本框中显示下拉框所选项目的功能。 (css) - 位于下拉前面的文本框的样式。 (设置) - 初始化元素的设置文件,以便我可以自动在任何地方使用它。
我想象的文件夹结构:
在combo_box-helper.rb我有2个方法:
该方法使用部分返回组合框。阵列条目可在下拉框中找到。
使用javascript创建组合框时,必须调用该方法。要仅对组合框进行一次更改,还应使用partial创建元素并将其传递给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
问题:
.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-files添加到资产管道中)?
感谢您的帮助。