2012-02-23 2 views
5

Приложение позволяет пользователям голосовать за встроенные видео. Когда пользователи нажимают стрелки вверх и вниз, вся страница обновляется до обновления points. Я уже несколько месяцев пытаюсь провести голосование AJAX. Я бы хотел получить самое простое решение, которое вы можете предложить, даже если оно не является самым эффективным. Есть идеи?Обновление элементов в Rails с помощью 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

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

ответ

10

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

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

.... 

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.

+0

Awesome Я искал это, но решение всегда касалось базового CRUD ..... thanx ......... – Magnum

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