如何在视图中呈现部分 js 或访问在应用程序/资产中的 js.erb 文件中的控制器操作中初始化的实例变量/方法
How to render partial js in views or access instance variables/methods initialized in controller action in js.erb file which is in app/asset
有关信息,.*js.erb
在相应的控制器操作发生时加载。
我知道这个问题的不同版本被问到,所以任何有能力将其标记为重复的人都会很快做到这一点。只要我得到我具体问题的答案,我就不会有任何问题。
问题如下:-
当用户被创建/更新时,它会在控制器中经历四个操作,用于创建新的和创建(如果验证失败,则呈现相同的部分,并显示来自创建操作的错误消息)和更新编辑和更新,它们具有不同的部分服务于目的。虽然,理想情况下,一部分应该就足够了,但新的要求不同,编辑所以......两个,保留一个将需要大量的条件语句,最终导致代码不可读。现在,我有 .*.erb.js 文件,该文件对于两个部分是相同的,并且仅在请求这些页面时才需要。这会导致代码冗余,不利于代码的可维护性,而且避免将js代码放在html文件中。出于这两个原因,我更喜欢更好的解决方案来解决我的问题。为了准确说明我的麻烦,我在下面列出了几个例子:
@user
,在控制器和phone_number_home的相应操作中初始化,并验证用户的phone_number_general。 所以在 js.erb 中我有
<% if(@user.phone_number_home.present? || @user.phone_number_general.present?) %>
<%= do sth %>
<% else %>
<%= do sth %>
<% end %>
或类似的东西:-
<% if(params[:action].to_s == "edit")%>
<%= do sth %>
<% else %>
<%= do sth %>
<% end %>
错误报告 - 在前者中说undefined method *phone_number_home* for nil:NilClass
,在后者中它undefined local variable or method
参数'',而 _form_new.html.erb 视图中脚本标记下的同一段代码可以正常工作。但不是当它保存在资产管道中时(这是我在寻求答案时遇到的第一个麻烦,经过大量谷歌搜索,这个链接解决了问题,但只是部分并将我的麻烦分支到上面的一个,所以再次大量的谷歌搜索让我多次参考解决方案,例如
1:)尝试在 js.erb 文件中使用控制器变量时引发的 NoMethodError
2:)甚至一遍又一遍地检查这个截屏,以防错过什么
但是它们都没有达到目的,除了上述问题只是我应该能够使用嵌入式javascript做什么的一个例子,为了突出我的问题,我还渲染了html标签的部分onClick()
,我在控制器操作中发送不同的初始化变量,因此尽管有解决方法(将代码放在各自的部分_.*.html.erb
中),但所有这些麻烦都无法寻求问题的答案但是为了逃避冗余并加强代码的可维护性,我需要更好的解决方案来解决我的问题。
提前谢谢。
注意:- 任何阅读此解决方案的人都不会得到或(秒)的答案 部分问题,但此处提供的解决方案将来肯定会有很大帮助,如果它不能回答导致您来到这里的问题。
发布问题后,我疯狂地回到页面,看看是否至少我对我的问题发表了评论,或者标记为重复(以便我得到我一直辛勤工作的答案),但无济于事。但与此同时,我尝试了不同的方法来解决问题,因为我对同样的事情感到不安,从我最近几天获得的知识中。随着一些解决问题的疯狂想法,当我从 - rendering html partial
(无处不在)在 rails 项目中得到这个想法时,出现了顿悟的时刻。所以我想为什么不对javascript文件尝试相同的方法。因此,我写的下面的代码是 partial(html) from,其中在 partial javascript 下呈现在脚本标签中:
<script type="text/javascript">
<%= render '_new_edit' %>
</script>
当我尝试这样做时,我遇到了一个错误,因为文件名被错误地输入了,我在控制台中遇到的错误是这样的:
# other details, processing and query to database
Completed 500 Internal Server Error in 24.5ms
ActionView::MissingTemplate - Missing partial users/_new_edit, application/_new_edit
with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}.
搜索于:
*"/app/views"
* "~/.rvm/gems/ruby-2.0.0/bundler/gems/sms_confirmable-785b1781433c/app/views"
* "~/.rvm/gems/ruby-2.0.0/gems/devise/app/views"
注意:- 上述请求请求是通过ajax到弹出表单的用户控制器中的新操作(对于最终解决方案很重要)。
因此,当文件名被更正时(通过删除前面的"_"以输入"new_edit"作为render
方法的参数)瞧 - 它工作并且 JavaScript 加载流畅。我认为我有解决方案,所以继续创建一个成功运行的用户。现在是时候创建输入错误或输入较少的用户了,以便验证失败,但这次不是一张快乐的脸。标记了错误,报告内容如下:
# user details in params, processing by users controller create action and required query to db
Completed 500 Internal Server Error in 24.5ms
ActionView::MissingTemplate - Missing partial users/_new_edit, application/_new_edit
with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}.
搜索于:
*"/app/views"
* "~/.rvm/gems/ruby-2.0.0/bundler/gems/sms_confirmable-785b1781433c/app/views"
* "~/.rvm/gems/ruby-2.0.0/gems/devise/app/views"
注意:- 由于表单提交是非 ajax 请求,并且表单验证存在错误,因此站点的用户应该看到表单输入的错误报告,需要呈现相同的部分表单,因此在解析相同页面边栏时查找带有项目中不存在的format => [:html]
的"new_edit
"文件,因此上述错误。
现在可以看到,为不同类型的请求(ajax或简单的html链接)查找了不同格式的部分。尽管在前者中,它部分查找([:js,:html])类型,但在后者中仅查找:html
格式,因为请求是通过html link
。
所以从这里我明白了为什么不提供formats
参数来渲染方法,并且做同样的事情。尽管在为渲染提供参数时有一个警告 - 当不是默认情况下时,最好显式提供部分,如下所示。
<script type="text/javascript">
<%= render(:partial => 'new_edit', :formats => :js) %>
</script>
不是(
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX <script type="text/javascript">
<%= render('new_edit', :formats => :js) %>
</script>
因为这会在渲染时产生错误,而不是通过ajax
。
注意:- 不要在没有脚本标签的情况下尝试此方法,因为这只会编写 js 代码和 html 部分呈现在 js 文件中的任何内容。
警告:- 由于我没有关于我提到的要点的任何文献,因此欢迎任何有更好理解的人改进答案或嵌入此答案以及支持答案的链接或其他内容。
干杯!!!
- 如何根据条件加载Anguar.js控制器
- Angular JS控制器初始化错误
- 如何将Ember.js控制器连接到视图
- $scope$观察数组中的一个特定对象——Angular JS控制器
- 如何使Angular JS控制器与指令一起工作
- 角度 JS 控制器未实例化
- 如何使用 Minitest 触发 JS 控制器操作
- Alfresco-将变量值从js控制器传递到freemarker
- 如何在angular.js控制器中添加谷歌地图
- Angular JS控制器和Factory在单独的文件中
- Angular html文件可以'找不到JS控制器[Node.JS/Angular]
- 实际的angular js控制器对象包含什么
- 减少angular js控制器中的依赖关系
- 如何在 angular js 控制器中使用 alasql
- Angular.js - 控制器不为索引执行,适用于其余模板
- 角度 js 控制器不工作
- Ember.js 控制器不起作用
- Angular js 控制器只打印大括号
- 如何在角度js控制器的下拉列表中获取所选值
- 如何在用户使用护照登录的情况下测试帆.js控制器.js