2012-02-23 28 views
5

Ứng dụng cho phép người dùng bỏ phiếu cho video được nhúng. Khi người dùng nhấp vào mũi tên lên và xuống, toàn bộ trang sẽ làm mới để cập nhật points. Tôi đã cố gắng thực hiện bỏ phiếu AJAX trong nhiều tháng nay. Tôi muốn giải pháp đơn giản nhất mà bạn có thể cung cấp, ngay cả khi nó không hiệu quả nhất. Bất kỳ ý tưởng?Cập nhật các phần tử trong Rails bằng Ajax

My updown hành động từ 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 

    .... 

Một phiên bản nhỏ gọn của links_list, một phần từ app/views/links/_links_list, mà tôi render trong quan điểm khác sử dụng phương pháp phân loại khác nhau

<% @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 %> 
  • tôi sẽ muốn đạt được điều này mà không cần sử dụng một viên ngọc bên ngoài, ứng dụng đã có trong sản xuất
  • Tôi có thể đã xem và thử hầu hết các đường ray 3 hướng dẫn liên quan đến ajax và đường ray. Nếu bạn đăng liên kết tới hướng dẫn, vui lòng đề xuất các bản sửa đổi cần phải thực hiện để nó hoạt động.
  • Tôi đang chạy Rails 3.1

Cảm ơn trước vì bất kỳ phản hồi hoặc đề xuất nào!

Trả lời

10

Ajax khá dễ sử dụng trong Rails 3.1. Bài đăng này giả sử bạn đang sử dụng jQuery làm trình điều khiển JavaScript của bạn; nếu bạn không, bạn sẽ cần phải cài đặt đá quý jquery-rails, nhưng ngay cả đối với một ứng dụng trong sản xuất thêm một viên đá quý nhỏ không phải là một thỏa thuận thực sự lớn.

điều khiển của bạn sẽ kết thúc lên trông như thế này:

.... 

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 

.... 

Sự thay đổi quan điểm sẽ được khá nhỏ:

<% @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> 

Và bạn sẽ cần tập tin mới, up.js.erb và down.js.erb, trong ứng dụng/lượt xem/liên kết/thư mục của bạn, chứa lệnh JavaScript để cập nhật trang của bạn:

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

Nếu bạn quyết định đi với Prototype hoặc một cái gì đó mã sẽ nhìn nhiều hơn hoặc ít hơn như nhau; thay đổi duy nhất sẽ là JavaScript mà bạn đặt trong tệp up.js.erb và down.js.erb, sẽ là Prototype-y thay vì jQuery-y.

+0

Tuyệt vời Tôi đã tìm kiếm điều này nhưng giải pháp luôn là về CRUD cơ bản ..... thanx ......... – Magnum

Các vấn đề liên quan