Решил это. Мне нужно было передать слаг к выбранному атрибуту, а не к имени. Если вы реализуете это, вы, вероятно, используете id
вместо slug
. В любом случае, это то, что сработало для меня.
<%= f.input :folder,
collection: current_user.folders,
label_method: :name,
value_method: :slug,
selected: @folder.slug
%>
Я очень очень рекомендую использовать LSB app / library checker. Он расскажет вам быстро, если вы:
Вы можете получить дополнительную информацию здесь , а также загрузить инструмент. Его легко запустить ... просто распакуйте его, запустите скрипт на Perl и укажите свой браузер на localhost ... остальное - браузер.
Используя этот инструмент, вы можете легко получить сертификацию LSB для вашей библиотеки / приложения (для обеих версий) и сделать работу дистрибутора гораздо проще.
Кроме того, просто используйте что-то вроде libtool (или подобного), чтобы убедиться, что ваша библиотека установлена правильно, предоставьте статический объект для людей, которые не хотят связываться с DSO (потребуется время, чтобы ваша библиотека появилась в большинстве дистрибутивов, поэтому написание портативная программа, я не могу рассчитывать на ее присутствие) и хорошо прокомментирую ваш публичный интерфейс.
Для библиотек я считаю, что Doxygen работает лучше всего. Документация очень важна, она, безусловно, влияет на мой выбор библиотеки для использования в любой заданной задаче.
В самом деле, еще раз, проверьте средство проверки приложений, оно даст вам отчеты о проблемах переносимости, для которых потребуется год, чтобы библиотека вышла из строя. в дикой природе, чтобы получить иное.
Наконец, постарайтесь сделать так, чтобы ваша библиотека легко помещалась «в дереве», чтобы мне не приходилось статически ссылаться на нее. Как я сказал, может пройти несколько лет, прежде чем он станет распространенным в большинстве дистрибутивов. Мне гораздо проще просто взять ваш код, поместить его в src / lib и использовать его до тех пор, пока ваша библиотека не станет общей. И, пожалуйста, пожалуйста ... дайте мне модульные тесты, TAP (протокол что угодно) - хороший и портативный способ сделать это. Если я взломаю вашу библиотеку, мне нужно будет (быстро) узнать, не сломал ли я ее, особенно при ее изменении в дереве или en situ (если DSO существует).
Я знаю, что вы спрашиваете. Для Windows MSFT тщательно сделал все библиотеки DLL совместимыми, поэтому ваши библиотеки DLL обычно совместимы практически с любой версией Windows, поэтому вы называете это «переносной».
К сожалению, в Linux слишком много вариантов (и все мы думаем быть «разными», чтобы зарабатывать деньги), чтобы вы не могли получить те же преимущества, что и Windows, и поэтому у нас есть множество одинаковых пакетов, скомпилированных для разных дистрибутивов, версии дистрибутива, типа процессора, ...
Некоторые говорят, что проблема вызвано архитектурой (CPU), но это не так. Даже на одной и той же арке между дистрибутивами есть различия. Как только вы действительно попытаетесь выпустить бинарный пакет, вы поймете, насколько это сложно - даже зависимость от библиотеки времени выполнения C трудно поддерживать. В ОС Linux слишком много всего, поэтому почти все службы связаны с проблемой зависимости.
Обычно вы можете создать только какой-нибудь двоичный файл, совместимый с каким-либо дистрибутивом (или несколькими дистрибутивами, если вам повезет). Вот почему выпуск программ для Linux в двоичном коде всегда затруднен, если только он не связан с каким-либо дистрибутивом, таким как Ubuntu, Debian или RH.
В идеале вы захотите использовать GNU autoconf , automake и libtool для создания конфигурации и создания сценариев, затем распространите библиотеку как источник с созданными файлами configure и Makefile.in.
Вот электронная книга о них .
./ configure; делать; make install
является довольно стандартным в Linux.
Корень проблемы в том, что Linux работает на многих разных процессорах. Вы не можете просто полагаться на процессор, поддерживающий инструкции x86, как в Windows (для большинства версий: Itanium (XP и новее) и Alpha (NT 4.0) являются исключениями).
Итак, вопрос в том, как разработать разделяемые библиотеки для Linux? Вы можете взглянуть на это руководство или Howto Library Pogram Library .
Если вы хотите помочь своим пользователям, предоставив им скомпилированный код, лучший из известных мне способов - предоставить им статически связанный двоичный файл + документацию о том, как они могут запускать двоичный файл. (Это возможно в дополнение к предоставлению им исходного кода. ) Большинство статически связанных двоичных файлов работают на большинстве дистрибутивов Linux с той же архитектурой (+ 32-разрядные (x86) статически связанные двоичные файлы работают на 64-разрядных (amd64)). Неудивительно, что Skype предоставляет статически связанную загрузку Linux.
Вернуться к вопросу о вашей библиотеке. Даже если вы являетесь экспертом в написании разделяемых библиотек в Linux и не торопитесь минимизировать зависимости, чтобы ваша разделяемая библиотека работала в разных дистрибутивах Linux, включая старые и новые версии, невозможно гарантировать, что она будет работать в будущем (скажем, 2 года). Скорее всего, вы в конечном итоге будете поддерживать файл .so, то есть снова и снова вносить небольшие изменения, чтобы файл .so стал совместимым с более новыми версиями дистрибутивов Linux. Это долго не доставляет удовольствия, и это существенно снижает вашу производительность: время, которое вы тратите на поддержание совместимости библиотеки, было бы гораздо лучше потрачено, например, на улучшение функциональности, эффективности, безопасности и т. д. программного обеспечения.
Также обратите внимание, что очень легко расстроить ваших пользователей, предоставив библиотеку в .so форма, которая не работает в их системе. (И у вас нет сверхдержавы, чтобы заставить его работать на во всех системах Linux, поэтому такая ситуация неизбежна.) Вы также предоставляете 32-битные и 64-битные системы, включая x86, PowerPC, ARM и т.д.? Если файл .so работает только в Debian, Ubuntu и Red Hat (поскольку у вас нет времени перенести файл в другие дистрибутивы), вы, скорее всего, расстроите своих пользователей SUSE и Gentoo (и более).
безопасность и т. д. программного обеспечения.Также обратите внимание, что очень легко расстроить ваших пользователей, предоставив библиотеку в форме .so, которая не работает в их системе. (И у вас нет сверхдержавы, чтобы заставить его работать на во всех системах Linux, поэтому такая ситуация неизбежна.) Вы также предоставляете 32-битные и 64-битные системы, включая x86, PowerPC, ARM и т.д.? Если файл .so работает только в Debian, Ubuntu и Red Hat (поскольку у вас нет времени перенести файл в другие дистрибутивы), вы, скорее всего, расстроите своих пользователей SUSE и Gentoo (и более).
безопасность и т. д. программного обеспечения.Также обратите внимание, что очень легко расстроить ваших пользователей, предоставив библиотеку в форме .so, которая не работает в их системе. (И у вас нет сверхдержавы, чтобы заставить его работать на во всех системах Linux, поэтому такая ситуация неизбежна.) Вы также предоставляете 32-битные и 64-битные системы, включая x86, PowerPC, ARM и т.д.? Если файл .so работает только в Debian, Ubuntu и Red Hat (поскольку у вас нет времени перенести файл в другие дистрибутивы), вы, скорее всего, расстроите своих пользователей SUSE и Gentoo (и более).
так что эта ситуация неизбежна.) Вы также предоставляете 32-битные и 64-битные версии, включая x86, PowerPC, ARM и т. д.? Если файл .so работает только в Debian, Ubuntu и Red Hat (поскольку у вас нет времени перенести файл в другие дистрибутивы), вы, скорее всего, расстроите своих пользователей SUSE и Gentoo (и более). так что эта ситуация неизбежна.) Вы также предоставляете 32-битные и 64-битные версии, включая x86, PowerPC, ARM и т. д.? Если файл .so работает только в Debian, Ubuntu и Red Hat (поскольку у вас нет времени перенести файл в другие дистрибутивы), вы, скорее всего, расстроите своих пользователей SUSE и Gentoo (и более).Простое помещение файла .so в / usr / lib может работать, но вы, вероятно, испортите схему, используемую вашим дистрибутивом для управления библиотеками.
Взгляните на стандартную базу Linux - это самая близкая вещь, которую вы найдете к общей платформе среди дистрибутивов Linux.
http://www.linuxfoundation.org/collaborate/workgroups/lsb
Что вы пытаетесь выполнить?
Ответ Тинкертима точен. Добавлю, что важно понимать и планировать изменения в ABI gcc . В последнее время все было довольно стабильно, и я думаю, что все основные дистрибутивы находятся на gcc 4.3.2 или около того. Тем не менее, каждые несколько лет некоторые изменения в ABI (особенно биты, связанные с C ++), кажется, приводят к хаосу, по крайней мере, для тех, кто хочет выпустить кросс-дистрибутивы, и для пользователей, которые привыкли собирать пакеты из других дистрибутивов, отличных от их запуска, и находить, что они работают. Пока идет один из этих переходов (все дистрибутивы обновляются в своем собственном темпе), в идеале вы хотите выпустить библиотеки с ABI, поддерживающими полный спектр версий gcc, используемых вашими пользователями.