如何在视图中呈现部分 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 文件 初始化 方法 变量 实例 操作 应用程序 视图      更新时间:2023-09-26

有关信息,.*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 文件中的任何内容。

警告:- 由于我没有关于我提到的要点的任何文献,因此欢迎任何有更好理解的人改进答案或嵌入此答案以及支持答案的链接或其他内容。

干杯!!!