2013-08-21 3 views
2

Предположим, что у меня есть приложение Rails, в котором пользователи могут писать сообщения в блоге. После того, как пользователь начнет печатать, вызывается функция AJAX, которая фиксирует запрос POST и сохраняет сообщение в блоге. То, что я хотел бы сделать, это проверить, находится ли сообщение в блоге уже в базе данных, а затем непрерывно сохранять его через AJAX по типу пользователя.Обновление моделей Rails через AJAX?

Я использую contenteditable атрибут HTML5 для заголовка и содержания сообщения в блоге областей ввода:

<div id="entry-create-partial"> 
    <div id="title-create-partial" name="title" contenteditable="true" data-placeholder='Title it' style="color:black"></div> 
    <div id="content-create-partial" name="content" contenteditable="true" data-placeholder='Write anything' style="color:gray"></div> 
</div> 

Вот JavaScript, чтобы делать то, что я хочу:

$(function(){ 
     if ($("#title-create-partial").length > 0) { 
      setTimeout(autoSavePost, 6000); 
     } 
    }); 

    function autoSavePost(){ 
     $.ajax({ 
      type: "POST", 
      url: "/submissions", 
      dataType: "json", 
      data: {title: $("#title-create-partial").text().serialize(), content: $("#content-create-partial").text().serialize()}, 
      success: function(){ 
       $("#success-indicate").fadeIn().delay(4000).fadeOut(); 
      } 
     }); 
     setTimeout(autoSavePost, 6000); 
    } 

Однако в моей JS консоли Я получаю сообщение об ошибке, указывающее, что данные, которые я дал .ajax, не имеют метода сериализации. Я не уверен, как правильно передать его AJAX.

Кроме того, как только я отправлю его через AJAX, я не уверен, как обновить :content на стороне базы данных. Вот create контроллер, что URL маршруты Аякса:

def create 
    @submission = Submission.where(title: params[:title]).first_or_create(
     title: params[:title], 
     content: params[:content], 
     user_id: params[:user_id] 
     ) 
    @submission.user = current_user 
    if @submission.save 
     redirect_to :action => :show, :id => @submission.id 
    else 
     redirect_to :action => :index 
    end 

end 

Как отправить текст из contenteditable дивы, а затем в контроллере, как обновить содержимое? Я слышал о update_attributes, но я не уверен, как это использовать.

+0

С точки зрения jquery просто используйте '.text()' для своего названия и контента. Это просто текст ...сериатизировать нечего. – Divey

+0

Когда я это делаю, я получаю ошибку «неопределенный метод» stringify_keys в моей консоли. –

+0

Nevermind, исправлена ​​проблема stringify_keys. –

ответ

3

Этот код здесь:

$("#title-create-partial").text() 

возвращает строку. Затем вы вызываете метод с именем serialize() в строке. Нет javascript-метода с именем serialize(). У jQuery есть метод с именем serialize(), но он должен быть вызван в объект jQuery. Строка не является объектом jQuery. И, насколько я могу судить, serialize() даже не работает над неформатными элементами. Вот как вы будете использовать Serialize:

var str = $("form").serialize(); 

Или

var str = $("#my_text_input, #my_select").serialize() 

, который будет производить строку, как это:

"text_input_name=hello&select_name=goodbye" 

Однако, согласно документации JQuery, JQuery автоматически упорядочивает пары ключей/значений, которые вы указываете для данных внутри .ajax() - поэтому вы не хотите их сериализовать снова.

Как отправить текст из контентных объявлений, а затем в контроллере , как я могу обновить контент?

Чтобы активировать вызов ajax, вам необходимо выбрать событие. Вероятно, лучшим вариантом было бы установить тайм-аут, чтобы выходить каждые 5 минут, что вызывает вашу функцию ajax.

Что касается обновления содержимого базы данных, вы можете запросить свою базу данных и посмотреть, есть ли у пользователя сообщение с тем же заголовком. Если запрос возвращается с 0 результатами, затем создайте новую запись с контентом. В противном случае установите содержимое сообщения в новый контент.Что-то вроде этого:

id = params[:session][:id] 
ajax_title = params[:title] 
ajax_content = params[:content] 

user = User.find id 
posts = user.posts.where(title: ajax_title) 

if posts.empty? 
    post = user.posts.create(title: ajax_title, content: ajax_content) 
else 
    post[0].content = ajax_content 
    post[0].save 
end 

Это предполагает, что вы сделали:

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
end 
+0

Спасибо за помощь. Вы правы, проблема, с которой я сейчас сталкиваюсь, - это обновить сообщение в моей базе Postgres через контроллер почтового сообщения. По крайней мере, я немного ближе! –

+0

@TomMaxwell, я добавил код рельсов. – 7stud

+0

Решила с вашей помощью. Спасибо! –

0

пожалуйста, только с помощью text() когда адресности заголовок значение и содержание. И при использовании serialize() более эффективен при получении данных из ввода формы. Поэтому измените свой код ниже.

$(function(){ 
     if ($("#title-create-partial").length > 0) { 
      setTimeout(autoSavePost, 6000); 
     } 
    }); 

function autoSavePost(){ 
    $.ajax({ 
     type: "POST", 
     url: "/submissions", 
     dataType: "json", 
     data: {title: $("#title-create-partial").text();, content: $("#content-create-partial").text();}, 
     success: function(){ 
      $("#success-indicate").fadeIn().delay(4000).fadeOut(); 
     } 
    }); 
    setTimeout(autoSavePost, 6000); 
} 
1

Это скорее комментарий, чем ответ. Я пишу это здесь, потому что это немного длиннее.

Мне трудно понять вашу логику. Кажется, сервер будет создавать тонны сообщений при каждом попадании.

Предположим, вы собираетесь написать сообщение под названием «Обновление моделей Rails через AJAX».

Когда вы вводите «U» в заголовке ввода, запускается Ajax, сервер получил заголовок «U». В db нет такого сообщения под названием «U», поэтому контроллер его создает.

Затем вы вводите «p». Снова нет такого поста, поэтому создается новое сообщение «Вверх».

Теперь у вас есть две позиции: «U» и «Вверх». И еще будет создано после ввода текста.

Проверьте проблему? Исправьте меня, если ошибаетесь.

Добавить: О решении

Я не сделал такой случай, прежде чем это не может дать практику, но только некоторые идеи.

Субъективно я не думаю, что создание сообщения путем прямой печати - хорошая идея, причина, как указано выше. Я бы посоветовал:

  1. Основная: Создать пост на submit, либо Ajax обычного запроса.

  2. Дополнительно: Добавить вариант для сохранения в качестве черновика. А также добавьте функцию для просмотра или загрузки из черновика (форма редактирования). Сообщения же, как и обычная почта с дополнительной колонкой «проектом» в качестве истинного

  3. Даже продвинутый: После ввода кода много, говоря 100 символов в теле, автосохранение как черновик. Это похоже на ваш код с основным отличием в настройке проекта на стороне сервера.

Вы также можете заметить, в Stackoverflow, если вы пишете ответ, но не представить его в следующий раз, когда вы вернетесь, проект ответа по-прежнему в форме. Это проще, чем ваш случай, потому что ответ всегда связан с вопросом, и вам разрешено публиковать ответы один за другим, поэтому проект можно легко идентифицировать.

Но сообщение в блоге отличается, это основная модель, отсутствие связи, и вы можете создавать несколько черновиков одновременно. Поэтому вам нужно обратить внимание на загрузку проекта.

Всего несколько центов.

+0

Yup, я просто новичок Rails, пытающийся разобраться в этом один шаг за раз. :) –

+0

Но если у вас есть советы по лучшему способу сделать это, я был бы более чем счастлив увидеть это. : P –

+0

@TomMaxwell, см. Мои обновления. –

Смежные вопросы