Javascript 如何在视图中呈现部分js或访问在app/asset中的js.erb文件的controller action中初始化的实例变量/方法
有关信息,请参见当相应控制器动作发生时加载*js.erb 我知道这个问题的不同版本会被问到,所以任何有能力将其标记为重复的人都会很快地去做。我不会有任何问题,只要我得到我的具体问题的答案 问题如下:- 创建/更新用户时,它在控制器中经历四个操作:创建新建和创建(如果验证失败,则使用来自创建操作的错误消息呈现相同部分)和更新编辑和更新,它们具有不同的部分服务目的。虽然,理想情况下,一部分应该是足够的,但要求不同的新的和编辑,所以。。。第二,保留一个将需要大量的条件语句,最终导致代码的不可读性。现在,我有了*.erb.js文件,这两个部分都是相同的,并且只有在请求这些页面时才需要。这导致了代码中的冗余,这不利于代码的可维护性,而且希望避免将js代码放在html文件中。出于这两个原因,我更喜欢用更好的方法来解决我的问题。为了确切地说明我的问题,我列举了以下几个例子: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 我知道这个问题的不同版本会被问到,所以任何有能力将其标记为重复的人都会很快地去做。我不会有任何问题,只要我得到我的具体问题的答案 问题如下:- 创建/更新用户时,它在控制器中经历四个操作:创建新建和创建(如果验证失败,则使用来自创建操作的错误消息呈现相同部分)和更新编辑和更新,它们具有不同的部分服务目的。虽然,理想情况下,一部分应该是足够的,但要求不同的新的和编辑,所以。。。第二,保留一个将需要大量的条件语句,最终导致代码的不可读性。现在
@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