Ruby on Rails и jeditable (jquery)
Кто-нибудь получил плагин jquery jeditable для правильной работы в приложениях Rails. Если да, можете ли вы поделиться некоторыми подсказками о том, как его настроить? У меня возникли проблемы с созданием "submit-url".
IIRC, вы не можете просто вызвать ruby-код из javascript (пожалуйста, позвольте мне ошибиться:-). Вы имеете в виду RJS??? Разве это не ограничивается прототипом? Я использую jQuery.
UPDATE:
Uh..... спросил об этом некоторое время назад и тем временем переключился на другое решение. Но главная проблема IIRC заключалась в следующем:
Я использую ресурсы RESTful. Итак, скажем, мне нужно смоделировать блог и, таким образом, иметь ресурсы "посты". Если я хочу отредактировать сообщение (например, сообщение с идентификатором 8), мое обновление будет отправлено через HTTP в URL http://my.url.com/posts/8 с HTTP-глагол POST. Однако этот URL-адрес сконструирован в моем коде Rails. Итак, как я могу получить свой url-адрес в свой код jQuery? Поскольку это код RESTful, мой URL-адрес обновления будет изменяться с каждым сообщением.
Ответы
Ответ 1
Извините меня за то, что вы сейчас это сделали, но я нашел время снова изучить мой код. Я думаю, что я решил свою проблему с помощью следующего javascript (my application.js внутри rails):
jQuery(document).ready(function($) {
$(".edit_textfield").each( function(i) {
$(this).editable("update", {
type : 'textarea',
rows : 8,
name : $(this).attr('name'),
cancel : 'Cancel',
submit : 'OK',
indicator : "<img src='../images/spinner.gif' />",
tooltip : 'Double-click to edit...'
})
});
});
Это работает, если ваши URL-адреса контроллера RESTful.
Ответ 2
Вот как я подключил JEditable (1.6.2) с моим непринужденным Rails-приложением (2.2.2):
Встроенная форма:
<div id="email_name"><%= h( @email.name ) %></div>
$('#email_name').editable( <%= email_path(@email).to_json %>, {
name: 'email[name]',
method: 'PUT',
submitdata: {
authenticity_token: <%= form_authenticity_token.to_json %>,
wants: 'name'
}
});
Контроллер:
def update
@email = Email.find( params[:id] )
@email.update_attributes!( params[:email )
respond_to do |format|
format.js
end
end
update.js.erb
<%=
case params[:wants]
when 'name' then h( @email.name )
# add other attributes if you have more inline forms for this model
else ''
end
%>
Это немного неудобно с этим оператором switch. Было бы неплохо, если бы JEditable просто сохранил переданное значение по умолчанию, если запрос ajax был успешным и ничего не было возвращено.
Ответ 3
Если вы включаете файлы .js в свой html, тогда нет, но если у вас есть js inline в вашем шаблоне просмотра, то да, вы можете.
У вас также могут быть файлы .erb.js, которые представляют собой js-представления.
Все возможно: D
Ответ 4
Я не уверен, что полностью понимаю проблему, с которой вы сталкиваетесь, но я думаю, что вы можете добавить что-то подобное в свой javascript:
<%= url_for(@post) %>
Это зависит от того, как вы структурируете свой javascript, как у вас организованы ваши файлы и т.д.
Ответ 5
Если вы контроллеры немного меньше, чем спокойны. В частности, если у вас есть действие по обновлению определенного поля, это также работает. Ключ передает токен аутентификации.
index.html.erb
<span id="my_edit"><%= foo.bar %></span>
<script type="text/javascript">
$(document).ready(function() {
$("#my_edit").editable('<%= url_for(:action => "update_bar",
:id => foo) %>',
{
method: 'PUT',
cancel : 'Cancel',
submit : 'OK',
indicator : "<img src='../images/spinner.gif' />",
tooltip : 'Double-click to edit...',
submitdata: {
authenticity_token: <%= form_authenticity_token.to_json %>,
}
}
});
</script>
Облегченный контроллер, который не оправдывает неудобства:
foo_controller.rb
def update_bar
foo = Foo.find(params[:id])
bar= params[:value]
// insert justifiable code here
foo.save
render :text=>params[:value]
end
(Работает с Rails 2.2.2 и 2.3.2 с Jeditable 1.7.0 и jRails 0.4, хотя jRails не играет здесь большого взаимодействия, кроме предоставления включений для jQuery 1.5)