В моем контроллере у меня есть действие, которое не имеет соответствующего представления. Точно: действие загрузки для загрузки изображений. Тем не менее, я требую, чтобы текущий идентификатор пользователя сохранял URL-адрес изображения. Но метод current_user всегда возвращает nil, поскольку действие само по себе не имеет представления. В таких сценариях, как я могу получить current_user? Я использую authlogic. Мой application_controller.rb содержит следующее:Нужно ли получать текущее_значение для соответствующего представления?
class ApplicationController < ActionController::Base
helper :all
helper_method :current_user_session, :current_user
filter_parameter_logging :password, :password_confirmation
protect_from_forgery
def correct_safari_and_ie_accept_headers
ajax_request_types = [ 'application/json', 'text/javascript', 'text/xml']
request.accepts.sort!{ |x, y| ajax_request_types.include?(y.to_s) ? 1 : -1 } if request.xhr?
end
private
def set_cache_buster
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
end
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
end
EDIT: Все остальные действия в контроллере могут получить доступ к методу current_user
помощника. Действие только upload
не в состоянии. Код:
Контроллер:
class ImageStacksController < ApplicationController
def upload
# Using swfupload.
image_stack_params = {
:caption => params[:caption],
:swf_uploaded_data => params[:link]
}
# current_user returns nil, even with user logged in!!
# Occurs only in the upload action and no other action in this controller.
logger.info("Current User: #{current_user}") #Returns nil
@image_stack = current_user.image_stacks.create! image_stack_params
respond_to do |format|
format.js { render :json => @image_stack }
end
end
def edit
logger.info("Current User: #{current_user}") #Returns current user
end
def new
logger.info("Current User: #{current_user}") #Returns current user
end
def update
logger.info("Current User: #{current_user}") #Returns current user
end
def destroy
logger.info("Current User: #{current_user}") #Returns current user
end
end
Модель:
class ImageStack < ActiveRecord::Base
belongs_to :user, :class_name => "User", :foreign_key => "user_id"
upload_image_to_s3 :link
def swf_uploaded_data=(data)
data.content_type = MIME::Types.type_for(data.original_filename)
self.link = data
end
end
Я делаю его доступным для других классов, наследующих его, используя вспомогательный метод ': current_user'. Действие 'upload' является единственным действием, которое не может получить доступ к методу' current_user'. Другие действия в одном контроллере могут получить к нему доступ, хотя! Действительно, действительно странно !! Я обновляю свой вопрос кодом действия «upload». –
См. Раздел редактирования выше :) – mark
В журнале ничего не сообщается, кроме того, что current_user - это нуль! Итак, если методы-помощники для всех видов, которые мне нужно будет сделать, это передать current_user в качестве параметра с помощью swfupload !! Да, я понял это сейчас. Спасибо :) –