将lib文件夹用于rails中的应用程序部件

时间:2012-11-17 20:41:40

标签: ruby-on-rails ruby-on-rails-3.2

Ruby on Rails存在一些问题,即使花费数小时和数小时尝试也无法解决。我希望你们能帮助我。这四个问题在行尾开始标记为Q1-Q4。

我在视图中有一个元素,我需要不止一次。因此,lib文件夹中应该有一个单独的模块(所以我也可以在其他项目中使用它)。

我需要什么: - 一个帮助方法,我可以从任何视图自动调用。 - 因为它需要更多的html东西,我想使用一个html文件,我在helper-method中渲染。 - 将参数传递给javascript文件。 - 如果使用该元素,则必须包含JavaScript文件 - 如果使用该元素,则必须包含CSS文件

由于不容易理解我的意思,我将用一个简单的例子再次解释它(这只是一个例子,所以不要过多考虑它的意思):Helper用于创建一个组合框视图助手或者使用javascript方法。 显然,我需要 (html) - 放置在下拉框顶部的文本输入字段 (js) - 在文本框中显示下拉框所选项目的功能。 (css) - 位于下拉前面的文本框的样式。 (设置) - 初始化元素的设置文件,以便我可以自动在任何地方使用它。

我想象的文件夹结构:

  • LIB
    • combo_box
      • combo_box_helper.rb
      • _combo_box.html.erb
      • combo_box.js
      • combo_box.css

在combo_box-helper.rb我有2个方法:

  • combo_box_field(drop_down_content)

该方法使用部分返回组合框。阵列条目可在下拉框中找到。

  • combo_box_js(drop_down_content)

使用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

问题:

  • render-method不起作用(它在app / view中搜索部分)
  • 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-files添加到资产管道中)?

感谢您的帮助。

0 个答案:

没有答案