Поиск:

Ответ в темуСоздание новой темы Создание опроса
> русские буквы 
V
    Опции темы
RedAlliance
  Дата 8.3.2011, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



в контроллере создала метод для генерации логина в приложении:
Код
    def gen_username(first_name,surname)
        username_letters = first_name[0,1].downcase + surname[0,2].downcase
        new_username = username_letters + "000"
        number = 0
        while User.find_by_username(new_username) do
            number+=1
            if(number < 10)
                username_number = "00" + number.to_s
            elsif(number < 100)
                username_number = "0" + number.to_s
            end
            new_username = username_letters + username_number
        end
        return(new_username)
    end

с латиницей всё работает замечательно,а вот с русскими именем и фамилией:в консоли пишет абракадабру,а в базу заносит пустое поле(у файла контроллера кодировка utf-8 без bom)...
как с этим бороться?
PM MAIL   Вверх
source777
Дата 9.3.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(RedAlliance @  8.3.2011,  20:33 Найти цитируемый пост)
с латиницей всё работает замечательно,а вот с русскими именем и фамилией:в консоли пишет абракадабру,а в базу заносит пустое поле

Ожидаемо, русские буквы занимают по 2 байта, а ты сходу пытаешься использовать первый байт имени.
Посмотри ActiveSupport::Multibyte::Chars


Это сообщение отредактировал(а) source777 - 9.3.2011, 00:50


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
RedAlliance
  Дата 9.3.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



я сделала так: взяла [0,2] и [0,4] соответственно..осталось только сделать их маленькими буквами,потому что .downcase тут не срабатывает..
PM MAIL   Вверх
RedAlliance
  Дата 10.3.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



в итоге получилось:
[code=ruby] username_letters = first_name.mb_chars.downcase.to_s[0,2] + surname.mb_chars.downcase.to_s[0,4][/ruby]
        
PM MAIL   Вверх
source777
Дата 10.3.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Твой вариант фигов в первую очередь тем, что он негласно требует чтобы first_name и surname были в двухбайтовой кодировке, если они окажутся английскими, то логика изменится.

Правильнее делать как-то так:
Код

username_letters = (first_name.mb_chars[0,1] + surname.mb_chars[0,2]).downcase.to_s


P.S. Кстати surname логичнее переименовать в last_name.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
RedAlliance
  Дата 12.3.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



спасибо!!!-так действительно правильнее,и в других местах не придётся высчитывать байты smile 
PM MAIL   Вверх
RedAlliance
  Дата 12.3.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



как-то странно получается:
при загрузке файлов слегка поменяла в связи с русскими буквами код в uploadfile.rb:
Код
if visible != nil
            puts "#{visible.mb_chars.length}"
            if (visible.mb_chars.length >= 6)#username consists of 6 bytes(3 bytes for letters + 3 bytes for digits).    
                until visible == nil or visible == "" 
                    @uploaded = Uploadedfile.new
                    @filepath = directory + "/" + @name
                    @size_of_file = File.size(@filepath)
                    if visible.mb_chars[visible.mb_chars.length - 1].to_s == " " or visible.mb_chars[visible.mb_chars.length - 1].to_s == ";" or visible.mb_chars[visible.mb_chars.length - 1].to_s == ","
                     @uploaded.username = visible.mb_chars[visible.mb_chars.length - 7,6].to_s
                     puts "with #{@uploaded.username}"
                     visible = visible.mb_chars[0, visible.mb_chars.length - 7].to_s    
                    else
                     @uploaded.username = visible.mb_chars[visible.mb_chars.length - 6,6].to_s
                     puts "without #{@uploaded.username}"
                     visible = visible.mb_chars[0, visible.mb_chars.length - 6].to_s    
                    end                                                
                    @uploaded.original_filename = @orginal
                    @uploaded.disc_filename = @name
                    @uploaded.file_size = (@size_of_file/1024)
                    @uploaded.save
                end
            end
            
        end


в контроллере не меняла:
Код
def upload_file
      log_user()
      update()
      
      @user = User.find(:first, :conditions => ["username = ?", cookies[:username]])
      @group_visible = params[:group]
      @users = params[:accept].to_s
    
  
      if not (@group_visible == nil and @users == nil and params[:datafile] == nil and params[:upload] == nil)
        post = Uploadedfile.save(params[:upload],@user.username,@users,@group_visible)
        flash[:uploaded] = "Файл был успешно загружен!"
      end
      
      redirect_to :back
    end


при этом с латиницей нормально работало:загружало тем,кого указал,а теперь ещё и лишним,а именно: почему-то всем преподам(userclass=1)-не понимаю,откуда???

Это сообщение отредактировал(а) RedAlliance - 13.3.2011, 00:04
PM MAIL   Вверх
source777
Дата 13.3.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Срочно читай "Рефакторинг" Фаулера.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
RedAlliance
  Дата 14.3.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



то есть это мой код способствует тому,что там лишние получатели образуются-то есть код неверный?или вам просто не нравится,как написано-то есть код корявый?
PM MAIL   Вверх
source777
Дата 19.3.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(RedAlliance @  14.3.2011,  19:25 Найти цитируемый пост)
то есть это мой код способствует тому,что там лишние получатели образуются-то есть код неверный?или вам просто не нравится,как написано-то есть код корявый? 

Корявый - это когда отступы некрасиво расставленны, а для подобного кода общепринятое именование - "дурнопахнущий". Даже ты - автор кода - уже не в силах понять что делает твой код (эквивалент "почему не работает как ожидается"), это явный признак того, что код следует полностью переписать как можно скорее.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
RedAlliance
  Дата 20.3.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



переписала код:
Код
if visible != ""
            @filepath = directory + "/" + @name
            @size_of_file = File.size(@filepath)
            
            visible = visible.scan(/\w+/)
            visible.uniq!
            
            visible.each do |receiver|
                @uploaded = Uploadedfile.new(:username => receiver, 
                                      :original_filename => @orginal, 
                                      :disc_filename => @name, 
                                      :file_size => (@size_of_file/1024))
                @uploaded.save
            end
            
        end

-всё то же самое: лишние получатели с userclass==1(хотя нет никакого упоминания о них ни в контроллере,ни здесь(в модели для загрузки файлов).....)

Это сообщение отредактировал(а) RedAlliance - 20.3.2011, 12:10
PM MAIL   Вверх
RedAlliance
Дата 20.3.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 1.12.2010

Репутация: нет
Всего: нет



так и не поняла,в чём была проблема..в итоге сделала так:
Код
if visible != ""
    
            visible = visible.scan(/\w+/)
            visible.uniq!
            
            visible.each do |receiver|
                @uploaded = Uploadedfile.new
                @filepath = directory + "/" + @name
                @size_of_file = File.size(@filepath)
                @uploaded.username = receiver
                @uploaded.original_filename = @orginal
                @uploaded.disc_filename = @name
                @uploaded.file_size = (@size_of_file/1024)
                @uploaded.save
            end
            
        end

всё работает так,как надо smile 
PM MAIL   Вверх
source777
Дата 20.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Во, так гораздо лучше, только непонятно откуда берётся строка visible и почему ты решила массив назвать так же как строку...
А раз получатели берутся из этой строки, то ошибка скорее была в коде, который формировал строку, а не в приведённом участке, который эту строку разбирает.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby on Rails"
source777
  • С чего начать? начинаем
  • Документацию смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby On Rails | Следующая тема »


 




[ Время генерации скрипта: 0.0936 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.