Getting started with Backbone
По-моему это лучшая статья для начинающих изучение Backbone.js
Ruby. Require всех файлов из директорий
Когда работал с Rails не задумывался как можно сделать require всех файлов из директорий динамически. Начал разбираться с Sinatra и появилась необходимость исключить модели и конфиг из основного файла app.rb
Dir[ "./config/*.rb", "./models/*.rb" ].each {|f| require f}
OpenJDK -> Sun JVM
Использую Aptana Studio для разработки. В поисках рецепта увеличения стабильности и производительности нашел:
sudo update-alternatives --config java
Переключился и понял что мне этого не хватало…)
Настройка ssh на bitbucket
Перенес 3 репо на bitbucket. Немного помучился с настройкой ssh для деплоя на production сервер.
Ссылки на оф. документацию, которые помогли:
Devise. Обновляем атрибуты без пароля.
Не всегда бывает удобно просить пользователя вводить пароль каждый раз при обновлении его профиля или при изменении одиночных атрибутов в любом месте вашего rails приложения. Для этого можно использовать метод:
update_without_password
в экшене update, что-то типа этого:
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
if resource.update_without_password(params[resource_name])
...
attr_accessible & attr_protected
Сам долго не понимал зачем нужны эти методы, а оказывается:
Без указания attr_accessible все атрибуты модели открыты и не сложно догадаться, что даже если вы не указали в форме какой либо атрибут (например group_id в User модели), зная его кулхацкер сможет его изменить… и присвоить, например, себе статус премиум пользователя.
Указав атрибуты в методе attr_accessible можно спасть спокойно и быть уверенным что будут изменяться(.update_attributes() итд) только эти атрибуты.
…либо, используем attr_protected и указываем в методе только те атрибуты, которые хотим защитить.
http://guides.rubyonrails.org/security.html#_mass_assignment
Метод .live() в Jquery 1.7 не поддерживается
Зашел почитать в api и увидел, что в 1.7 .live() больше поддерживаться не будет. Использую его достаточно часто для манипуляции над элементами, которые появляются на странице динамически.
Теперь рекомендуется использовать .on()
$('a').live('click', fn);
$(document).on('click', 'a', fn);
Отличная статья на хабре о нововведениях релиза 1.7
TinyMCE и Jquery Tools Tabs
Возможно есть способ подружить TinyMCE с табами Jquery Tools, т.е. сделать так, чтобы редактор инициализировался на всех вкладках, но я его не нашел и пришлось сделать так:
<script type="text/javascript">
function loadEditor(){
tinyMCE.init({
language : 'ru',
mode: 'textareas',
height: 250,
theme : 'advanced',
plugins : "paste",
paste_auto_cleanup_on_paste : true,
theme_advanced_buttons1 : "bold,italic,separator,bullist,link,unlink,pasteword",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_align : 'left',
theme_advanced_toolbar_location : 'top'
});
}
$(document).ready(function(){
loadEditor();
var api = $("ul.tabs").data("tabs");
api.onClick(function(e, index) {
loadEditor();
});
})
</script>
—-> upd
Как оказалось не все так просто, редакторы на каждой вкладке инициализируются, но контент не сохраняется.
Ну а вот так все ok:
<script type="text/javascript">
$(document).ready(function(){
ids = []
$('.description').each(function(){
ids.push($(this).attr('id'))
})
tinyMCE.init({
language : 'ru',
mode: 'exact',
elements: ids.join(),
width: 678,
height: 250,
theme : 'advanced',
plugins : "paste",
paste_auto_cleanup_on_paste : true,
theme_advanced_buttons1 : "bold,italic,separator,bullist,link,unlink,pasteword",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_align : 'left',
theme_advanced_toolbar_location : 'top'
});
})
</script>