在Rails控制器动作中包含来自文件的js代码

时间:2019-07-11 23:07:20

标签: ruby-on-rails

我在控制器中执行了一个操作,该操作将api调用发送到第三方应用程序。 有效负载的一部分是应用程序存储的字符串格式的js代码。

这是一个例子:

def store_code_on_app
    myCode = "
        function hello(you){
            console.log("hello", you);
        }
    "

    RestClient.post(
    "http://theapp.com/codes/create",
        {
            code: myCode
        }
    )
end

由于我的实际代码很长,以后为了更好地管理多个代码,我想将这些代码存储在rails应用程序中某个文件夹内的文件中,然后从控制器中调用它。我希望使用适当的扩展名(mycode.js)保存文件,以便更轻松地进行处理和调试。

您如何建议我这样做?可能是通过要求或包含文件?也许在lib文件夹中?

1 个答案:

答案 0 :(得分:2)

如果您不希望任何动态内容,则可以将其保存在任何位置并使用File.read加载。

lib / something / code.js

function hello(you){
   console.log("hello", you);
}

控制器

def store_code_on_app
    myCode = File.read("#{Rails.root}/lib/something/code.js")

    RestClient.post(
    "http://theapp.com/codes/create",
        {
            code: myCode
        }
    )
end

如果它是动态的,您可以使用render_to_string,但对此我不确定,但是可以使用类似的方法

app / views / shared_js_templates / code.js.erb

function <%= console_string %>(you){
  console.log("<%= console_string %>", you);
}

控制器

def store_code_on_app
    myCode = render_to_string(
      'shared_js_templates/code.js.erb',
      layout: false,
      locals: { console_string: 'hello' }
    )

    RestClient.post(
    "http://theapp.com/codes/create",
        {
            code: myCode
        }
    )
end

借助动态功能,您可以执行以下操作:

app / views / shared_js_templates / code.js.erb

<% 10.times do |index| %>
  function hello<%= index %>(you){
    console.log("hello<%= index %>", you);
  }
<% end %>