我有一些我想分享的控制器方法.在轨道上的红宝石中执行此操作的最佳做法是什么?我应该创建一个我的控制器扩展的抽象类,还是应该创建模块并将其添加到每个控制器?以下是我想要分享的控制器方法:
def driving_directions
@address_to = params[:address_to]
@address_from = params[:address_from]
@map_center = params[:map_center_start]
# if we were not given a center point to start our map on
# let's create one.
if !@map_center && @address_to
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
elsif !@map_center && @address_from
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
end
end
def printer_friendly
starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
ne = params[:ne].split(',').collect{|e|e.to_f}
sw = params[:sw].split(',').collect{|e|e.to_f}
size = params[:size].split(',').collect{|e|e.to_f}
address = params[:address]
@markers = retrieve_points(ne,sw,size,false)
@map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
@address_string = address
end
Run Code Online (Sandbox Code Playgroud) 我正NoMethodError试图从我的一个控制器类中访问我的一个辅助模块中定义的方法.My Rails应用程序使用helper带有:all符号的类方法,如下所示:
class ApplicationController < ActionController::Base
helper :all
.
.
end
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该使我的所有控制器类自动包含app/helpers目录中的所有辅助模块,因此将所有方法混合到控制器中.它是否正确?
如果我include在控制器中明确指出了辅助模块,那么一切正常.
我有个问题:
undefined method `avatar_url' for #<User:0x000000040783a8>
Run Code Online (Sandbox Code Playgroud)
控制器:
class ApplicationController < ActionController::Base
protect_from_forgery
helper :all
helper_method :avatar_url
protected
def avatar_url(user)
if user.avatar_url.present?
user.avatar_url
else
default_url = "#{root_url}images/guest.png"
gravatar_id = Digest::MD5.hexdigest(user.email.downcase)
"http://gravatar.com/avatar/#{gravatar_id}.png?s=48&d=#{CGI.escape(default_url)}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
在视图中:
...
<%for user in @users %>
<%= image_tag avatar_url(user) %>, username: <%= user.username %>, e-mail: <%= user.email %>
<% end %>
...
Run Code Online (Sandbox Code Playgroud)
谁来帮帮我?
更多新手问题.
我知道如果我在我的应用程序助手中定义一个方法,它可用于整个应用程序代码.
在我的应用助手中,我有:
def primary_user_is_admin
if current_user
user_login_roles = JSON.parse(current_user.role)
if user_login_roles["admin"]
return 1
end
end
return nil
end
Run Code Online (Sandbox Code Playgroud)
如果我从categories_controller调用它:
if !primary_user_is_admin
redirect_to root_url
end
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:未定义的局部变量或方法`primary_user_is_admin'
如果我将primary_user_is_admin代码放在registrations_helper.rb文件中,也会发生这种情况
但是,如果我在任何视图中使用它(例如views/user/edit.html.erb)
<% if primary_user_is_admin %>
<% end >
Run Code Online (Sandbox Code Playgroud)
然后它工作.我错过了什么?