[js and rails] Create your Mime::Type for ajax

Обновление данных на странице без перезагрузки – это удобно для пользователя, а значит – это требуеться и от нас.

В Rails  можно получить данние от серевера в разных формата например:  json или text ….
Но мне кажеться, все-таки удобнее если получить сразу готовый html, для этого можно использовать:

  render :html => your_html

или

  #выводим партиал и передаем в него данные
  render :partial => "partial_path", :locals => {:variable_name => @variable_value}

это все хорошо, но партиал в который мы передаем данные – это по сути шаблон и не очень разумно его использовать только при отрисовке страници.

Представим, что у нас есть некоторый метод (action) show который например выводит 5 последних новостей.

# news_controller.rb
  def show
    @variable_value = News.limit(5).order("created_at DESC")
  end

Во view мы используем partial для красивого вывода новостей например:

# show.html.erb
<div id="newsWrapper">
  <%= render partial=>"parse_news", :locals => {:variable_name => @variable_value}%>
</div>

Сам партиал выглядит примерно так:

# _parse_news.html.erb
<% variable_name.each do |news|%>
  <div class="news">
    <span><%= news.title%></span>
    <span><%= news.content%></span>
    <span><%= news.created_at%></span>
  </div>
<% end %>

и вот именно часть партиала нам нужно будет обновлять, например при нажатии на кнопку “обновить” (id=”button”),
мы можем написать отдельный метод, который нам будет возвращать html или, например, возвращать json и потом со стороны js создавать нужный html и потом обновлять содержимое блока

Мне эти варианты кажутся не очень удобными.

Можно создать свой тип данных который вас спасет.
Открываем config/initializers/mime_types.rb и дописываем свой превдоним для “text/html”
для того чтобы при запросе AJAX’ом нам возвращало заполненый партиал.

# config/initializers/mime_types.rb
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf
# Mime::Type.register_alias "text/html", :iphone
  
  #мы создали свой псевдоним
  Mime::Type.register_alias "text/html", :jshtml    

Теперь в наш метод show дописываем

# news_controller.rb
  def show
   @variable_value = News.limit(5).order("created_at DESC")
    
    respond_to do |format|
      # спработает для нашего ajax запроса
      format.jshtml { render partial=>"parse_news", :formats => [:html], :locals => {:variable_name => @variable_value}}
      # будет срабатывать для view show.html.erb
      format.html
    end
  end

В вызов партиала добавлен :formats = [:html] это для того, чтобы вызвать именно партиал parse_news.html.erb,
а не parse_news.jshtml.erb

А сам js(jQuery) будет выглядеть так

# news.js
  $(document).ready(function() {
    $("#button").bind("click", function() {
      $.post("news/show.jshtml", function(data) {
        $("#newsWrapper").html(data);
      });
    });
  });

И не забудте перезагрузить приложение 🙂
Надеюсь было полезно 🙂

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s