Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在视图中呈现部分js或访问在app/asset中的js.erb文件的controller action中初始化的实例变量/方法_Javascript_Jquery_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Javascript 如何在视图中呈现部分js或访问在app/asset中的js.erb文件的controller action中初始化的实例变量/方法

Javascript 如何在视图中呈现部分js或访问在app/asset中的js.erb文件的controller action中初始化的实例变量/方法,javascript,jquery,ruby-on-rails,ruby,ruby-on-rails-3,Javascript,Jquery,Ruby On Rails,Ruby,Ruby On Rails 3,有关信息,请参见当相应控制器动作发生时加载*js.erb 我知道这个问题的不同版本会被问到,所以任何有能力将其标记为重复的人都会很快地去做。我不会有任何问题,只要我得到我的具体问题的答案 问题如下:- 创建/更新用户时,它在控制器中经历四个操作:创建新建和创建(如果验证失败,则使用来自创建操作的错误消息呈现相同部分)和更新编辑和更新,它们具有不同的部分服务目的。虽然,理想情况下,一部分应该是足够的,但要求不同的新的和编辑,所以。。。第二,保留一个将需要大量的条件语句,最终导致代码的不可读性。现在

有关信息,请参见当相应控制器动作发生时加载*js.erb

我知道这个问题的不同版本会被问到,所以任何有能力将其标记为重复的人都会很快地去做。我不会有任何问题,只要我得到我的具体问题的答案

问题如下:-

创建/更新用户时,它在控制器中经历四个操作:创建新建创建(如果验证失败,则使用来自创建操作的错误消息呈现相同部分)和更新编辑更新,它们具有不同的部分服务目的。虽然,理想情况下,一部分应该是足够的,但要求不同的新的和编辑,所以。。。第二,保留一个将需要大量的条件语句,最终导致代码的不可读性。现在,我有了*.erb.js文件,这两个部分都是相同的,并且只有在请求这些页面时才需要。这导致了代码中的冗余,这不利于代码的可维护性,而且希望避免将js代码放在html文件中。出于这两个原因,我更喜欢用更好的方法来解决我的问题。为了确切地说明我的问题,我列举了以下几个例子:

@user
,在控制器的相应操作中初始化,并验证用户的电话号码和电话号码。所以在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 %>

错误报告-在前者中表示nil:NilClass的
undefined method*phone\u number\u home*,在后者中表示
undefined local variable或method
params`,而在_form\u new.html.erb视图中script标记下的同一段代码可以正常工作。但当它被保存在资产管道中时就不是了(这是我在寻找答案时遇到的第一个问题,在谷歌搜索了很多次之后,这解决了问题,但只是部分地解决了问题,并将我的问题分为以上一个问题,所以谷歌再次为我提供了多个解决方案的参考,例如

1:)

2:)

但是它们都没有达到这个目的,除了上面的问题只是一个例子,说明了我应该如何使用嵌入式javascript,为了突出我的问题,我还呈现了html标记的部分
onClick()
,当我在控制器操作中发送不同的初始化变量时,尽管有解决问题的方法(将代码放在相应的部分
.*.html.erb
),但为了避免冗余并加强代码的可维护性,我需要一个更好的解决方案来解决我的问题

提前谢谢

注意:-任何阅读此解决方案的人都不会得到的答案(秒) 问题的一部分,但这里提供的解决方案肯定会在未来有很大的帮助,如果它不能回答这个问题,导致你在这里

张贴完问题后,我疯狂地回到页面,看看是否至少我对我的问题有了评论,或者标记为重复(这样我就可以得到我辛苦了很长时间的答案),但没有结果。但同时,我尝试了不同的方法来解决这个问题,这与我在过去几天里所获得的知识不同,因为我对同样的问题感到不安。为了解决这个问题,我有了一些疯狂的想法,当我在rails项目中通过-
呈现html部分时(普遍使用)产生了顿悟。所以我想为什么不试试同样的javascript文件。因此,我编写的以下代码是来自的部分(html),其中部分javascript在脚本标记中呈现:

<script type="text/javascript">
    <%= render '_new_edit' %>
</script>
在中搜索:

  *"/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"
  *"/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向用户控制器中的新操作发送的,用于弹出表单(对于最终解决方案很重要)

因此,当文件名被更正时(通过删除前面的“u”以输入“new_edit”作为
render
method的参数)。瞧,它工作正常,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"
  *"/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请求,并且表单验证中存在错误,因此网站用户应该收到表单输入的错误报告,该表单输入需要呈现相同的部分表单,因此在解析相同页面时,rails使用
格式=>[:html]查找“
新编辑
”文件
项目中不存在,因此会出现上述错误

正如我们现在看到的,对于不同类型的请求(ajax或简单的html链接),使用了不同格式的partial。虽然在前者中,它在partial中查找两个([:js,:html]),但在后者中,它只查找
:html
格式,因为请求是通过
html链接进行的

所以从这里我得到了一个想法,为什么不提供
格式
args来渲染方法,并且做同样的工作。尽管在提供要呈现的参数时有一个警告——如果不是case,那么最好显式地提供partial,如下所示

<script type="text/javascript">
  <%= render(:partial => 'new_edit', :formats => :js) %>
</script>          

'新编辑',:格式=>:js)%>
不是(XXXXXXXXXXXXXXXX)


:js)%%>
因为这会在不通过
ajax
渲染时生成错误

注意:-在没有脚本标记的情况下不要尝试此方法,因为这样只会编写js代码,并且html部分的任何内容都会呈现在js文件中

警告:-A