如何在视图中呈现部分js或访问在app / asset中的js.erb文件中的控制器操作中初始化的实例变量/方法

时间:2014-11-17 00:44:40

标签: javascript jquery ruby-on-rails ruby ruby-on-rails-3

对于在发生相应控制器操作时加载的信息.*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参数&#39;`,而脚本标记下的相同代码段位于 _form_new.html.erb 将正常工作。但不是当它被保留在资产管道中时(这是我在寻求答案时遇到的第一个麻烦,经过大量的谷歌搜索后,link将问题排除在外但只是部分地将我的麻烦分成了上面的一个,所以再一次很多谷歌搜索为我提供了多种解决方案,例如

1 :) NoMethodError thrown when trying to use controller variables in js.erb file

2 :) Even went over this screen-cast over and over again in case missed something

但它们都没有达到目的,除了上面的问题只是我应该能够用嵌入式javascript做的一个例子,为了突出我的问题,我也渲染了部分onClick()的html标签,我在控制器操作中发送不同的初始化变量,所以所有这些麻烦寻求我的问题的答案,尽管有解决方法(将代码放在各自的部分_.*.html.erb)我的麻烦,但逃避冗余和加强代码的可维护性,我需要一个更好的解决方案来解决我的问题

提前致谢。

1 个答案:

答案 0 :(得分:0)

注意: - 任何阅读此解决方案的人都不会得到的答案(第二个)  问题的一部分,但如果它没有回答引导你的问题,那么今后提供的解决方案肯定会有很大的帮助。

在发布问题之后,我疯狂地回到页面,看看我是否至少对我的问题发表评论,或者标记为重复(以便我得到了我已经辛苦工作很长时间的答案),但是徒劳无功。但同时我尝试了不同的方法来解决我在过去几天获得的知识问题,因为我对此同样不安。当我从rails项目中获得 - rendering html partial(无处不在地使用)的想法时,有一些疯狂的想法来解决这个问题。所以我想为什么不尝试 javascript 文件。因此,我写的下面的代码是部分(html)from,其中部分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到用户控制器中的新操作弹出窗体(对于最终解决方案很重要)。

所以当文件名被更正时(通过删除&#39; _&#39;在前面输入&#39; new_edit&#39;作为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请求,并且表单验证中存在错误,因此应该向网站的用户显示表单输入的错误报告,该报告需要呈现相同的部分形式,所以当解析相同的页面rails导致&#39; new_edit&#39;项目中不存在format => [:html]的文件,因此出现上述错误。

现在可以看到,不同格式的partial被寻找不同类型的请求(ajax或简单的html链接)。虽然在前者中它同时寻找([:js,:html])两种类型,但后者仅查找:html格式,因为请求是通过html link

所以从这里我知道为什么不提供formats args来渲染方法,并做同样的工作。虽然在给出渲染参数时有一点谨慎 - 当不在default情况下时,最好明确提供部分,如下所示。

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

不(XXXXXXXXXXXXXXXXXX)

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

因为这不会通过ajax生成错误。

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

警告: - 由于我没有获得关于我提到的观点的任何文献,所以欢迎任何有更好理解的人提高答案或将此答案嵌入支持答案的链接或其他方面。

欢呼!!!