方法可以吗?在 javascript 个文件中

method can? in javascript file

我在尝试调用方法时遇到错误可以吗?

undefined method `can?' for #<#:0xa9a6d0e8>

spr_well_types.js.erb 文件:

    <% if can? :buttoncreate, SprWellType %>
        container.append('<div style="margin-left: 5px; float: left;" id="spr_well_type_addrowbutton"><span class="glyphicon glyphicon-plus"></span>Add</div>');
    <% end %>

application.html.erb 文件:

<%= stylesheet_link_tag "application", params[:controller], :media => "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", params[:controller], "data-turbolinks-track" => true %>

assets.rb 文件:

%w( home
    spr_well_types
    spr_well_purposes 
    spr_well_constructions 
    spr_prod_programs
    spr_well_constr_details
    carpets
    spr_minefields
    spr_org_structures
    spr_layers
    mwp_plan_drillings
    planing_drill_wells
    spr_drill_rig_types
    schedules
    devise/sessions
    devise/registrations
    permissions
     ).each do |controller|
      Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
    end

由于资产是预编译的,因此它们无法了解请求和会话。
您必须通过具有此知识的程序部分(即视图)提供此数据。

我通常将此类信息设置为布局中的全局 DOM 变量或数据属性(或我在所有布局中插入的共享视图),并在我的预编译 JS 中使用此全局数据。

Ruby预编译JS文件的处理(js.erb)用于在编译时计算资源路径

如果 spr_well_types.js.erb 在您的资产管道 (IE /app/assets/javascripts/...) 中,您会发现您无法在其中使用任何面向对象的方法。

Martin M 所述,这是因为 资产 是静态的 (CSS/JS)。它们可以 precompiled so that they have small file sizes (minified) 在生产中。

使用 paths 和其他 helpers 是可以接受的(这些不会改变),但尝试使用诸如 can? 根本行不通(它们依赖于动态数据)。

简单的解释就是JS是client-side而Rails是server-side。 JS 无法访问与 Rails 相同的数据,因此无法对不存在的数据使用 运行 方法。


观看次数

如果你想使用这种类型的功能,你必须把它放在你的 views 目录中,通过控制器操作调用它。

此服务器端 javascript 未预编译,并且 可以访问与 Rails 相同的数据。因此,在 ERB 的帮助下,您可以使用您需要的面向对象的方法。

你没有提供足够的上下文让我知道你是如何调用文件的,但这是你可以做什么的一个例子:

#app/controllers/spr_well_types_controller.rb
class SprWellTypesController < ApplicationController
   def show
     # your code here
     respond_to do |format|
       format.js #-> app/views/spr_well_types/show.js.erb
     end
   end
end

#app/views/spr_well_types/show.js.erb
<% if can? :buttoncreate, SprWellType %>
    container.append('<div style="margin-left: 5px; float: left;" id="spr_well_type_addrowbutton"><span class="glyphicon glyphicon-plus"></span>Add</div>');
<% end %>

必须注意 respond_to 采用请求 mime 类型,这意味着如果你想同时处理 htmljs 响应,你将不得不发送不同的请求使用他们各自的方法。如果需要,我可以解释更多。