2013-10-10 3 views
1

resque를 사용하여 백그라운드에서 파일을 처리하고 있습니다. CSV 파일이지만 다음과 같은 오류가 발생합니다. uninitialized constant ImportFileHelper::CSVResque는 'csv'가 작동하지 않아야합니다.

require 'csv'도 시도했는데 include CSV도 작동하지 않습니다.

require 'csv' 

module ImportFileHelper 
    HOST = "" 
    USER_NAME = "" 
    PASSWORD = "" 

    def self.process_file(file_data, file_name) 
    init 
    @file_name = file_name 
    begin 
     csv = CSV.parse(file_data, :headers => true) 
     csv.each do |row| 
     @first_name = row["FirstName"] 
     @last_name = row["LastName"] 
     @email = row["Email"] 
     @password = "[email protected]!" 
     @user_group_name = row["GroupName"].split(",") 
     @store_name = row["StoreName"] 
     @external_id = row["ExternalID"] 

     add_user unless @first_name.nil? || @last_name.nil? || @email.nil? || @password.nil? || @first_name.empty? || @last_name.empty? || @email.empty? 
     end 
    rescue NoMethodError => no_method_error 
     log_error_to_db no_method_error 
    rescue IOError => error 
     log_error_to_db error 
     @errors << error.to_s 
    rescue Exception => ex 
     log_error_to_db ex 
    end 
    prep_soap_responses_for_output 
    end 

    def self.init 
    HTTPI.log = false 
    @body = { username: USER_NAME, password: PASSWORD } 
    @errors = [] 
    @existing_users = [] 

    configure_savon 
    get_all_groups 
    get_all_stores 
    end 

    def self.prep_soap_responses_for_output 
    [@existing_users, @errors] 
    end 

    def self.log_error_to_db(error) 
    error.backtrace ||= "Not Available" 
    if error.message.length > 250 
     error_message = "There was an error" 
    else 
     error_message = error.message 
    end 
    ErrorLog.create(message: error_message, trace: error.backtrace, file_name: @file_name) 
    end 

    def self.get_store_id 
    @store_id = @stores[@store_name.to_sym] 
    end 

    def self.get_all_stores 
    @stores = { } 
    client = Savon::Client.new(HOST + "Storews.asmx?wsdl") 
    body_data = { mall_id: 1, is_return_offline_store: :false } 
    @body.merge! body_data 

    begin 
     response = client.request :get_store_list, body: @body 

     if response 
     hash_response = response.to_hash 
     stores = hash_response[:get_store_list_response][:get_store_list_result][:store] 

     stores.each do |s| 
      store = { s[:name].to_sym => s[:store_id] } 
      @stores.merge! store 
     end 
     end 
    rescue Savon::Error => ex 
     log_error_to_db error 
     @errors << error.to_s 
    end 
    end 

    def self.create_adbuilder_user_object 
    AdbuilderUser.new(@first_name, @last_name, @email, @user_id, @store_id, @store_name, @user_group_name, @group_id, @external_id) 
    end 

    def self.configure_savon 
    Savon.configure do |configure| 
     configure.log = false 
    end 
    end 

    def self.add_user 
    body_data = { first_name: @first_name, last_name: @last_name, user_password: @password, email: @email, external_id: @external_id } 
    @body.merge! body_data 
    begin 
     client = Savon::Client.new(HOST + "UserWS.asmx?wsdl") 
     response = client.request :add_user, body: @body 
     if response 
     @user_id = response.body[:add_user_response][:add_user_result] 

     if @user_group_name 
      get_group_id 
     end 

     if @store_name 
      @store_id = get_store_id 
      unless @store_id.to_s =~ /^0$/ 
      adbuilder_user = create_adbuilder_user_object 
      UserMailer.create_password(adbuilder_user).deliver if adbuilder_user 
      end 
     end 
     end 
    rescue Savon::Error => error 
     log_error_to_db error 

     if error.message == "(soap:Client) 3: A user with the same email login already exists. Please choose a different login." 
     @existing_users << @email 
     else 
     @errors << error.to_s 
     end 
    rescue Exception => error 
     log_error_to_db error 
     @errors << error.message.to_s 
    end 
    end 

    def self.get_group_id 
    begin 
     @user_group_name.each do |group_name| 
     user_group_id = @groups_info[group_name.downcase.to_sym] 
     add_user_to_group user_group_id if user_group_id 
     end 
    rescue Exception => error 
     log_error_to_db error 
     @errors << error.message.to_s 
    end 
    end 

    def self.get_all_groups 
    @groups_info = {} 
    begin 
     client = Savon::Client.new(HOST + "Usergroupws.asmx?wsdl") 
     response = client.request :get_user_group_list, body: @body 
     if response 
     group = response.to_hash 
     groups = group[:get_user_group_list_response][:get_user_group_list_result][:user_group] 

     groups.each do |g| 
      new_hash = { g[:name].gsub(/\s/, "_").downcase.to_sym => g[:user_group_id] } 
      @groups_info.merge! new_hash 
     end 
     end 
    rescue Savon::Error => error 
     log_error_to_db 
     @errors << error.to_s 
    end 
    end 

    def self.add_user_to_group(group_id) 
    body_data = { user_id: @user_id, user_group_id: group_id } 
    @body.merge! body_data 
    begin 
     client = Savon::Client.new(HOST + "Usergroupws.asmx?wsdl") 
     response = client.request :add_user_to_group, body: @body 
    rescue Savon::Error => error 
     log_error_to_db error 
     @errors << error.to_s 
    end 
    end 
end 

그래서이 문제를 해결하기 위해 resque 작업 파일에서 csv 구문 분석을 수행하고 있습니다. 이제 실행이 가능해졌습니다. 이것이 최선의 방법인지는 확실하지 않습니다.

class ProcessFile 
    @queue = :rts_file_parser 

    def self.perform(file_data, file_name) 
    csv = CSV.parse(file_data, :headers => true) 
    csv.each do |row| 
     row_data = { first_name: row["FirstName"], last_name: row["LastName"], email: row["Email"], password: "[email protected]!", user_group_name: row["GroupName"].split(","), store_name: row["StoreName"], external_id: row["ExternalID"] } 

     ImportFileHelper.process_file file_name, row_data 
    end 
    end 
end 
+2

오류가 발생한 전체 코드 파일. – rudolph9

+1

범위 분석에 문제가있을 수 있습니까? 'CSV.parse' 대신':: CSV.parse'를 시도하십시오. – GladstoneKeep

+0

점검 할 사항은 다음과 같습니다. 1. 모듈 이름은'ImportFileHelper'이고, 오류는'ImportFileHelper :: CSV'라고 말하면서 이름 지을 수 있습니까? 2. 이 파일은 자동로드 경로에 있습니다 (lib 폴더라고 가정). application.rb에서 확인해야 할 수 있습니다. 그리고 네,이 모듈을 호출하는 곳의 전체 코드는 @rudolph가 말한 것처럼 도움이 될 것입니다. – kasperite

답변

2

내 의견을 통해 답변을 구할 수 있습니까?

범위 해상도 문제 일 수 있습니다.

CSV 대신 ::CSV을 시도하십시오.

+0

아니, 나는 그것을 너무 투표했다. – covard

0

gemfile에 gem을 추가하십시오.