我正在尝试实现Ajax功能。我正在使用Angular,我想重用我已经拥有的很多Rails部分 - 比如表单。但是从我从研究中学到的知识来看,Rails'无法在资产管道中的JavaScript内部访问render
方法。
我想到的是,在一些事件被触发后 - onsubmit,onclick等 - 用适当的部分替换所选元素的innerHTML。
我见过的其他答案涉及使用*.js.erb
文件作为视图,但这种方法似乎没有很好地扩展 - 我拥有的Ajax调用越多,控制器方法和路由就越多。 #39;我必须设置,这听起来像是一场噩梦的开始。
这是否意味着前进的唯一方法是将Rails部分复制到Angular模板中,然后我可以使用我的JavaScript或我有其他选项?
我正在寻找的不是代码,只是关于如何修补内容的高级概念性概述。
请告知。
答案 0 :(得分:3)
当我第一次开始使用Angular和Rails时,我尝试采用你现在正在尝试的方法。不幸的是,这从未产生可接受的结果问题 - Angular必须始终知道您的数据发生了什么。当您通过AJAX渲染erb partials时,Angular和Rails不能以可预测的方式进行通信,并且调试起来非常困难。以下是我建议的高级选项:
<强> 1。严格使用Rails作为API
这种方法是构建大多数Rails / Angular应用程序的方法。忘掉rails中的任何前端视图或控制器。只需构建一个后端API来处理请求并提供JSON数据。 Angular处理前端的所有内容,包括通过ngResource的路由。而不是Rails部分,使用Angular模板。 angular-rails-template gem有助于将模板放入资产管道中。这种方法的好处是你有一个可以扩展到其他前端的纯API,比如本机iOS应用程序。您还会看到服务器端性能提升。
<强> 2。混合Angular和Rails,但忘记了AJAX
如果必须将erb视图与Angular混合使用,请避免使用remote: true
或ajax渲染。 Angular仍然适用于表单验证和单页内容。 Turbolinks在rails社区中得到了糟糕的说唱,但在这种情况下它实际上运行良好。异步页面加载感觉就像一个JS前端,同时允许角度在页面加载后编译。不理想,但可能。
Shopify跳过了Angular并建立了一个令人印象深刻的界面,就像Turbolinks(涡轮移植)一样,它的许多功能都可以在Rails 5中使用。Check out this post。
答案 1 :(得分:1)
您可以这样做:
get '/templates/*template' => 'templates#show'
class TemplatesController < ApplicationController
layout false
def show
if lookup_context.exists?("templates/#{params[:template]}")
render(template: "templates/#{params[:template]}")
else
head :not_found
end
end
end
然后角点命中该端点以获取您感兴趣的模板。