【问题标题】:method can? in javascript file方法可以吗?在 javascript 文件中
【发布时间】:2015-10-29 06:54:58
【问题描述】:

尝试调用方法时出现错误可以?

未定义的方法“可以吗?”对于#

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

【问题讨论】:

  • 试试圆括号can?(:buttoncreate, SprWellType)

标签: ruby-on-rails cancan


【解决方案1】:

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

正如Martin M 所提到的,这是因为assets 是静态的(CSS/JS)。它们可以是 precompiled,以便它们在生产中具有较小的文件大小 (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 响应,则必须使用它们各自的方法发送不同的请求。如果需要,我可以解释更多。

【讨论】:

  • 嗨,Rich Peck,很抱歉那是沉默,没有时间检查您所写的内容。我理解你的回答,结果证明是一个非常扩展的。据我了解 format.ys 对另一个来说没什么。我不想将它用于其他目的,并用大量代码填充它并描述组件。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多