2010-08-02 2 views
0

В моем контроллере у меня есть действие, которое не имеет соответствующего представления. Точно: действие загрузки для загрузки изображений. Тем не менее, я требую, чтобы текущий идентификатор пользователя сохранял 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 

ответ

1

Способ управления действительно только что метод класса. Это не требует представления. Я делаю это частным методом, метод не доступен вне класса или других классов, наследуемых от него, и поэтому он не доступен для представления. Ваша проблема говорит о том, что ваш пользователь не зарегистрирован или что-то еще не так. У вас есть метод require_user?

#application_controller 
private 

def require_user 
    unless current_user 
    store_location 
    flash[:notice] = t(:must_be_logged_in) 
    redirect_to user_login_path 
    return false 
    end 
end 

def store_location 
    session[:return_to] = request.request_uri 
end 

#user.rb 
has_many :images 

#image.rb 
belongs_to :user  

# image_controller.rb 
before_filter :require_user 

def create 
    @photo = @item.images.new(:photo => params[:photo], :user => current_user) 

Edit:

Ваш метод current_user является метод ApplicationController который уже унаследовал:

ImageStacksController < ApplicationController 

Это:

helper_method :current_user_session, :current_user 

предоставляет методы для просмотра.

Разница между действием загрузки и всеми остальными - это обновление вызывается javascript. Я помню, как я сделал аналогичный загрузчик и должен был пройти токен аутентификации. Сообщается ли что-либо еще в журнале?

Это может быть полезным для вас: http://github.com/JimNeath/swfupload---paperclip-example-app

Заставить подлинность маркера доступны для JS идет что-то вроде этого:

- content_for :head do 
    = javascript_tag "var AUTH_TOKEN = #{form_authenticity_token.inspect};" if protect_against_forgery? 

Теперь вы добавить поле к swflupload же, как вы добавили CURRENT_USER.

+0

Я делаю его доступным для других классов, наследующих его, используя вспомогательный метод ': current_user'. Действие 'upload' является единственным действием, которое не может получить доступ к методу' current_user'. Другие действия в одном контроллере могут получить к нему доступ, хотя! Действительно, действительно странно !! Я обновляю свой вопрос кодом действия «upload». –

+0

См. Раздел редактирования выше :) – mark

+0

В журнале ничего не сообщается, кроме того, что current_user - это нуль! Итак, если методы-помощники для всех видов, которые мне нужно будет сделать, это передать current_user в качестве параметра с помощью swfupload !! Да, я понял это сейчас. Спасибо :) –

Смежные вопросы