• Как запустить resque:scheduler под Windows?

    @sunnmas Автор вопроса
    Ruby
    с поставленными задачами справился гем clockwork/ Он замечательно работает с resque. и запускается под windows
    Ответ написан
    Комментировать
  • Как правильно настроить jQuery File Upload?

    done:  function(e, data){
    			data.context.removeClass('working');
    			response = data.jqXHR.responseJSON;
    			if (response.status == "error"){
    				data.context.addClass('error');
    				data.context.append('<i class="msg">'+response.msg+'</i>');
    			}
    			else{
    				data.context.append('<i class="msg">Фото загружено</i>');
    				data.context.append('<img src="'+response.msg+'"</img>');
    			}
            },


    def upload
    		response = {:status => nil, :msg => nil}
    		begin
    			if current_user.attachments.count>=10
    				raise UserException, "Превышено максимальное количество файлов."
    			end
    			attach = Attachment.new
    			attach.pic = params[:file]
    			attach.user = current_user
    			attach.save!
    			if attach.errors.empty?
    				response[:status]="success"
    				response[:msg] = attach.pic.thumb.url
    				render json: JSON.generate(response)
    			else
    				raise UserException, "Фото не добавлено."
    			end
    		rescue UserException => e
    			response[:status] = "error"
    			response[:msg] = e.message
    			render json: JSON.generate(response)
    		rescue Exception => e
    			response[:status] = "error"
    			response[:msg] = "Фатальная ошибка. "
    			response[:msg] << e.message if Rails.env.development?
    			render json: JSON.generate(response)
    		rescue
    			response[:status] = "error"
    			response[:msg] = "Фатальная ошибка."
    			render json: JSON.generate(response)	
    		end
    	end
    Ответ написан
  • Как получать ответ сервера после загрузки файла плагином jQuery File Upload?

    Плагин не реагирует на json
    {
    "status":"succsess"
    }

    У меня сервак, например, захлебывается от неверного файла (шлю txt переименованный в jpeg), а в браузере все нормально, файл отослан. Как заставить реагировать на ответы сервера? и выводить в браузер ошибки, которые генерит мой серверный скрипт обработки приема файлов?
    Вот как:
    браузер:
    done:  function(e, data){
    			data.context.removeClass('working');
    			response = data.jqXHR.responseJSON;
    			if (response.status == "error"){
    				data.context.addClass('error');
    				data.context.append('<i class="err-msg">'+response.msg+'</i>');
    			}
            },

    сервер:
    def upload
    		begin
    			attach = Attachment.new
    			attach.pic = params[:file]
    			attach.user = current_user
    			attach.save!
    			render json: '{"status":"success"}'
    		rescue
    			render json: '{"status":"error","msg":"Ошибка обработки файла."}'
    		end
    	end
    Ответ написан
    Комментировать
  • Как зарегистрировать пользователя от ВК на devise?

    @sunnmas Автор вопроса
    Ruby
    Во, похоже на то что мне нужно))
    initializers/devise.rb
    # ==> Configuration for :confirmable
      # A period that the user is allowed to access the website even without
      # confirming his account. For instance, if set to 2.days, the user will be
      # able to access the website for two days without confirming his account,
      # access will be blocked just in the third day. Default is 0.days, meaning
      # the user cannot access the website without confirming his account.
      config.allow_unconfirmed_access_for = 2.days

    Работает.
    Правда сегодня при регистрации на ivi.ru я увидел следующее:
    888b0440d49c40a79edf31d23a2f96be.png

    Вопрос: как получить доступ к электронному адресу из моего приложения?

    Нашел ответ здесь на сайте:
    Ссылка
    Ответ написан
    Комментировать
  • Как обойти ошибку сертификата на yandex при отсылке письма на Rails?

    @sunnmas Автор вопроса
    Ruby
    ActionMailer::Base.smtp_settings = {
    :enable_starttls_auto => true,
    address:"smtp.yandex.ru",
    port: 587,
    domain: "127.0.0.1:3000",
    authentication: "plain",
    user_name: "myemail@yandex.ru",
    password: "верный пароль"
    }
    Ответ написан
    Комментировать
  • Как создать и заполнить связанные выпадающие списки на Rails?

    @sunnmas Автор вопроса
    Ruby
    пока получилось методом костыля:
    <% cities = City.all.map{|city| [city.name, city.id]}%>
    <%= select_tag(:city_id, options_for_select(cities)) %>
    <% for city in cities %>
    <%= select_tag("district_id_"+city[1].to_s, 
    		options_for_select(District.where(:city_id => city[1]).map{|d| [d.name, d.id]})) %>
    <% end %>

    Это создало список городов и кучу списков районов
    Далее разруливаем в браузере:
    <script>
    	$("[name ^= district_id]").hide();
    	$("[name = district_id_1]").show();
    	$("[name = city_id]").change(function(){
    		cur_district = $("[name = 'adv[district_id]']");
    		cur_district.attr("name",cur_district.attr("id"));
    		$("[name ^= district_id]").hide();
    		$("[name = district_id_"+$(this).val()+"]").
    				attr("name","adv[district_id]").show();
    	});
    </script>
    Ответ написан
  • Как записать данные в две таблицы?

    model car
    belongs_to :color

    controller
    @car = Car.new(:power => 106)
    @car.color = Color.where(:id => 6).first
    @car.save

    Сайт объявлений?
    Ответ написан
  • Как провести платеж с помощью Yandex.Money API на Ruby on Rails?

    @sunnmas Автор вопроса
    Ruby
    Вернулся спустя полгода к проблеме, допилил, работает, юзайте, и да, укажите на проблемы безопасности, если они есть...
    Gemfile
    gem 'yandex-money-sdk'
    gem 'devise' #управление юзерами

    routes
    get		'/кошелек/пополнить', :to=> 'cabinet/balance#replenishment', :as => :replenishment
    		post	'/пополнение/счета', :to=> 'cabinet/balance#payment_process', :as => :payment_process
    		get		'/платеж/не/прошел', :to=> 'cabinet/balance#payment_fail', :as => :payment_fail
    		get		'/платеж/прошел/:secure_code', :to=> 'cabinet/balance#payment_success', :as => :payment_success

    app/helpers/yandex_money_helper.rb
    require 'yandex_money/api'
    
    module YandexMoneyHelper
    	class YM
    		# Класс служит для приема денег на Яндекс кошелек от других пользователей
    
    		# Разработчик регистрирует свое приложение в Яндекс.Деньгах,
    		# получает client_id - идентификатор приложения. 
    		# В течение жизненного цикла приложения client_id не изменяется.
    		CLIENT_ID = Rails.application.secrets.yandex_money_app_id
    		# Номер кошелька для приема нлатежей
    		WALLET_ID = Rails.application.secrets.yandex_money_wallet
    
    		attr_reader :successful
    		attr_reader :error
    		attr_reader :secure_code
    
    		def initialize
    			puts "=::YANDEX MONEY INITIALIZE::="
    			puts "CLIENT_ID: #{CLIENT_ID}"
    			puts "WALLET_ID: #{WALLET_ID}"
    
    			#Получение идентификатора экземпляра приложения на основе client_id
    			@instance_id = YandexMoney::ExternalPayment.get_instance_id(CLIENT_ID)
    			if @instance_id.status == "success"
    				@instance_id = @instance_id.instance_id
    				@ext_pay = YandexMoney::ExternalPayment.new @instance_id
    				@successful = true
    			else
    				@successful = false
    				@error = @instance_id.error
    			end
    
    			puts "instance_id: #{@instance_id}"
    			puts "ext_pay: #{@ext_pay}"
    		end
    		# Пополнение счета:
    		def recieve_payment(amount, email)
    			puts "reciving payment..."
    			@successful = false
    			@secure_code = rand 10000000..99999999
    			puts "secure_code: #{@secure_code}"
    			response = 	@ext_pay.request_external_payment({
    			  pattern_id: "p2p", #Фиксированное значение «p2p».
    			  to: WALLET_ID, #Номер счета для пополнения
    			  #amount: "1.00" Сумма к списанию с банковской карты (на счет поступит эта сумма минус комиссия).
    			  amount_due: amount, #Сумма к зачислению на счет (с карты будет списана эта сумма плюс комиссия).
    			  message: "Пополнение счета от #{email}" #Комментарий к зачислению, отображается получателю
    			})
    			puts "get request_id: #{response}"
    			if response.status != "success"
    				@error = response.error
    				return
    			end
    
    			@request_id = response.request_id
    			puts "request_id: #{@request_id}"
    			puts "process_payment..."
    			res = @ext_pay.process_external_payment({
    				request_id: @request_id,
    				ext_auth_success_uri: Rails.application.routes.url_helpers.payment_success_url(:secure_code => @secure_code),
    				ext_auth_fail_uri: Rails.application.routes.url_helpers.payment_fail_url
    			})
    			@successful = true
    			puts res
    			res
    		rescue => e
    			@successful = false
    			@error = e.message
    			puts "error recieving payment #{e.message}"
    			{:status => "error", :error => e.message}
    		end
    	end
    end


    /app/controllers/cabinet/balance_controller.rb
    class Cabinet::BalanceController < Cabinet::CabinetController
    #Пополнение счета
    	def replenishment
    		@amount = 100
    	end
    
    	def payment_process
    		@params[:amount] = {:type => :integer, :in => 1..10000.0}
    		return if !sanitize_params
    
    		@amount = params[:amount]
    		# Инициализация модуля Яндекс Деньги
    		ym = YM.new
    		err = "Ошибка работы с модулем оплаты "
    		if !ym.successful
    			err << ym.error if Rails.env.development?
    			flash[:error] = err
    			redirect_to replenishment_path
    			return
    		end
    		# Прием платежа на кошелек Яндекс Денег
    		res = ym.recieve_payment(@amount, "#{current_user.id}: #{current_user.email}")
    		if !ym.successful
    			err << ym.error if Rails.env.development?
    			flash[:error] = err
    			redirect_to replenishment_path
    			return
    		end
    		# Требуется внешняя аутентификация пользователя
    		if res.status != "ext_auth_required"
    			err = "Нет запроса на внешнюю авторизацию"
    			err << "status: #{res.status} error: #{res.error}" if Rails.env.development?
    			flash[:error] = err
    			redirect_to replenishment_path
    			return
    		end
    		# Сохраняем проверочный код платежа в сессии
    		session[:ym_secure_code] = ym.secure_code
    		session[:ym_amount] = @amount
    
    		# Отсылаем методом POST acs_params:
    		@acs_params = res.acs_params
    		@acs_uri = res.acs_uri
    		render :payment_process
    	end
    
    	def payment_fail
    		msg = 'Платеж не прошел.'
    		
    		reason = case params[:reason]
    		when 'no3ds' then 'Указан неверный код CVV.'
    		when 'not-enough-funds' then 'Недостаточно средств.'
    		else
    			e = Exception.new 'Платеж не прошел.'
    			ExceptionNotifier.notify_exception(e,
    				:env => request.env, 
    				:data => {:message => "Ошибка при совершении оплаты: #{params[:reason]}"})
    			params[:reason]
    		end
    		flash[:error] = msg << ' ' << reason
    
    		redirect_to replenishment_path
    	end
    
    	def payment_success
    #Эти 2 строки измените под свои нужды:
    		@params[:secure_code] = {:type => :integer, :in => 10000000..99999999}
    		return if !sanitize_params
    
    		secure_code = params[:secure_code]
    
    		if !session[:ym_secure_code] || !session[:ym_amount]
    			flash[:error] = "Платеж не прошел. Ошибка сессии"
    			redirect_to replenishment_path
    			return
    		end
    
    		amount = session[:ym_amount].to_i
    		if session[:ym_secure_code].to_i != secure_code
    			flash[:error] = "Не верный проверочный код платежа. Платеж не прошел"
    		else
    			current_user.with_lock do
    				@inc = Incoming.create(:user_id => current_user.id, :amount => amount)
    				current_user.amount += amount
    				current_user.amount = eval(sprintf("%8.2f",current_user.amount))
    				current_user.save(validate: false)
    			end
    			notify	"Баланс пополнен",
    					"Баланс пополнен на сумму #{amount} #{rub}. Текущий баланс: #{current_user.amount} #{rub}"
    			UserMailer.new_incoming(@inc.id).deliver if current_user.notify_incomings
    			flash[:success] = "Платеж прошел"
    		end
    		redirect_to replenishment_path
    	ensure
    		session[:ym_secure_code] = nil
    		session[:amount] = nil
    	end
    end


    app/views/replenishment.html.haml
    = form_tag(payment_process_path, method: "post") do
    	= label_tag(:amount, "Сумма без учета комисси банка, #{rub}:")
    	= number_field_tag :amount,  @amount ,in: 1..10000, step: 1
    	= submit_tag "Пополнить", :class => "button"

    app/views/payment_process.html.haml
    %p Подождите, Вы будете перенаправлены на страницу Яндекс Денег
    %form#ext_auth_required{:action=>@acs_uri}
    	%input{:type=>"hidden", :name=>"cps_context_id", :value=> @acs_params["cps_context_id"]}
    	%input{:type=>"hidden", :name=>"paymentType", :value=> @acs_params["paymentType"]}
    
    :javascript
    	document.forms["ext_auth_required"].submit();


    secure_code здесь это случайное число, которое рождается во время нового платежа и сохраняется в сессии юзера. Оно прикручено для того. чтобы пользователь не смог перейти по адресу /платеж/прошел и на шару пополнить себе баланс. Очищается из сессии в любом случае при переходе по этому адресу.

    Здесь форма ext_auth_required нужна для посылки POST запроса на сервак яндекса (см. api ЯД)
    Ответ написан
  • Как правильно использовать yandex-money-sdk gem в rails?

    Я использую RoR и гем по ссылке https://github.com/yandex-money/yandex-money-sdk-ruby.
    Читаю доку, раздел: Payments from bank cards without authorization
    Там три шага. После третьего имею статус ext_auth_required, во входящем параметре acs_uri получаю ссылку, на которую нужно послать post (прочитал здесь https://tech.yandex.ru/money/doc/dg/reference/proc...). Теперь мне нужно каким-то образом редиректится на acs_uri методом POST. Каким образом мне это сделать. В общем вопрос в том, что делать дальше после описанных 3 шагов? Инструкция кончается, а платеж еще не прошел.
    Ответ написан
    2 комментария
  • Работает ли JQuery на андроиде?

    @sunnmas Автор вопроса
    Ruby
    Александр, а вы пробовали зайти с телефона по ссылке? Скрипт очень простой. В чем может быть проблема? Я когда брался за работу - безусловно ожидал работы jquery с телефона.
    Ответ написан
  • Как работает z-index?

    разбирался по этой статье: habrahabr.ru/post/166435
    Ответ написан
    Комментировать