Обновление элементов в Rails с помощью Ajax - PullRequest
5 голосов
/ 23 февраля 2012

Приложение позволяет пользователям голосовать за встроенные видео.Когда пользователи нажимают стрелки вверх и вниз, вся страница обновляется до обновления points.Я пытаюсь внедрить голосование AJAX уже несколько месяцев.Мне бы хотелось самое простое решение, которое вы можете предложить, даже если оно не самое эффективное.Есть идеи?

Мои up и down действия от app/controllers/links_controller

  ....

  def up
    @link = Link.find(params[:id])
    @link.update_attribute :points, @link.points + 1
    redirect_to :back 
  end

  def down 
    @link = Link.find(params[:id])
    @link.update_attribute :points, @link.points - 1
    redirect_to :back 
  end 

  ....

Минималистская версия links_list, частичная от app/views/links/_links_list, которую я отображаю в других представлениях, используяразличные методы сортировки

  <% @links.each do |link| %>
        <div class="row">
            <div class="span2">
                <%= link_to (image_tag ("up.png")), up_link_url(link), :method => :put %> 
                <%= link.points %>
                <%= link_to (image_tag ("down.png")), down_link_url(link), :method => :put %>
            </div>
            <div class="span8">
                <%= link_to strip_tags(link.title), link %> 
            </div>
        </div>
  <% end %>
  • Я хотел бы добиться этого без использования внешнего драгоценного камня, приложение уже работает
  • Я, вероятно, видел и пытался большинство рельсов 3 учебникасвязанные с AJAX и рельсы.Если вы публикуете ссылку на учебное пособие, пожалуйста, предложите моды, которые понадобятся для его работы.
  • Я использую Rails 3.1

Заранее спасибо за любые отзывыили предложения!

1 Ответ

10 голосов
/ 23 февраля 2012

Ajax довольно прост в использовании в Rails 3.1. В этом посте предполагается, что вы используете jQuery в качестве драйвера JavaScript; в противном случае вам нужно будет установить гем jquery-rails, но даже для приложения, находящегося в производстве, добавление маленького камня не должно быть большой проблемой.

Ваш контроллер в конечном итоге будет выглядеть так:

....

def up
  @link = Link.find(params[:id])
  @link.update_attribute :points, @link.points + 1
  respond_to do |format|
    format.html {redirect_to :back}
    format.js
  end
end

def down 
  @link = Link.find(params[:id])
  @link.update_attribute :points, @link.points - 1
  respond_to do |format|
    format.html {redirect_to :back}
    format.js
  end
end 

....

Изменение вида будет довольно маленьким:

<% @links.each do |link| %>
  <div class="row">
    <div class="span2">
      <%= link_to (image_tag ("up.png")), up_link_url(link), :method => :put, :remote => true %> 
      <%= link.points %>
      <%= link_to (image_tag ("down.png")), down_link_url(link), :method => :put, :remote => true %>
     </div>
     <div class="span8">
       <%= link_to strip_tags(link.title), link %> 
     </div>
  </div>

И вам понадобятся новые файлы up.js.erb и down.js.erb в вашей папке app / views / links /, которые содержат команду JavaScript для обновления вашей страницы:

$(".span2").html("This post has <%= @link.points %> points.")

Если вы решите использовать Prototype или что-то еще, код будет выглядеть более или менее одинаково; единственным изменением будет JavaScript, который вы поместите в up.js.erb и down.js.erb, который должен быть Prototype-y вместо jQuery-y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...