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)