方法可以吗?在 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 类型,这意味着如果你想同时处理 html
和 js
响应,你将不得不发送不同的请求使用他们各自的方法。如果需要,我可以解释更多。
我在尝试调用方法时遇到错误可以吗?
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 类型,这意味着如果你想同时处理 html
和 js
响应,你将不得不发送不同的请求使用他们各自的方法。如果需要,我可以解释更多。