Как я могу вызвать `update_attribute` для элемента списка в rails, а затем обновить HTML с помощью jquery? - PullRequest
0 голосов
/ 10 февраля 2011

Я хочу, чтобы мои пользователи могли пометить один или несколько элементов из представления индекса как "Активные" или "Неактивные", используя ссылку.Текст для ссылки должен быть осведомлен о состоянии - поэтому по умолчанию он может иметь значение «Пометить как активный», если соответствующий атрибут имеет значение false или null, и «Пометить как неактивный», если он равен true.Как только пользователь щелкает ссылку и атрибут обновляется в контроллере, текст ссылки должен обновляться в соответствии с новым состоянием.

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

CONTROLLER
...
respond_to :html, :js
...
def update
  @item = Item.find(params[:id])
  if @item.update_attributes(params[:item])
    #Not sure of how to respond to .js here 
  end
end
...

update.js.erb
#how do I identify which element to update?
$('#item[13456]').html("State aware text for link_to")

VIEW
- for item in @items
  = item.name
  = link_to "Mark as Active", item_path(item), :method => :put, :remote => true. :id => "item[#{item.id}]"

Я с удовольствием читаю любые API, блоги, учебные пособия и т. д. Я просто не могу достать/ обдумайте эту задачу.Любая помощь или руководство с благодарностью!

1 Ответ

1 голос
/ 10 февраля 2011

Это грубая стартовая идея для вас.

Начну с простых вещей; вид:

= link_to @item.active == true ? "yes" : "no", make_active_path(@item), :class => 'item'

Затем, если они нажимают на элемент, мы нацеливаем его на jQuery и AJAX:

Эта плохая функция задницы будет работать для вас и для других вещей, так что просто бросьте это вверху вашего файла javascript. :

jQuery.fn.submitWithAjax = function() {
  this.live("click", function() {
    $.ajax({type: "GET", url: $(this).attr("href"), dataType: "script"});
    return false;
  });
};

Тогда внутри с остальным кодом jQuery напишите:

$(".item").submitWithAjax();

Запрос AJAX отправляется на ваш контроллер:

def make_active
    @item = Item.find(params[:id])
    if @item.active == true
      @item.update_attribute("active","false")
    else
      @item.update_attribute("active","true")
    end
    respond_to do |format|
     format.js { render :action => "update", :layout => false }
    end
end

Тогда заставьте update.js.erb сказать:

$("#item_#{@item.id}").replaceWith("#{ escape_javascript(render :partial => 'controller/item_view', :locals => {:item_view => @item}) }");

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

= render :partial => 'item_view', :collection => @items

Внутри файла с именем _item_view.html.haml запись:

%div{:id => "item_#{item_view.id}"}
    %div{:id => "post_#{post_view.id}"}

Для этого метода не забудьте составить маршрут в вашем rout.rb.

...