2015-09-08 2 views
0

мой взгляд в настоящее время выглядит следующим образом:JQuery не удаляя правильную строку в виду

<li class="list" data-id="<%=list.id%>"> 
    <div class="view" id="<%=list.id%>"> 
    <input class="toggle" type="checkbox" checked=""> 
     <%= button_to "Delete", { action: "destroy", id: list.id }, method: :delete, :class => "destroy", remote: true %> 
    <label><%= list.name %></label> 
    </div> 
    <%= form_for(list, remote: :true) do |f| %> 
    <%= f.text_field :name, :class => "edit" %> 
    <% end %> 
</li> 

и мой контроллер выглядит следующим образом:

class ListsController < ApplicationController 
    def index 
    @lists = List.order("created_at DESC") 
    @list = List.new 
    end 

    def create 
    @list = List.new(list_params) 
    if @list.save 
     if request.xhr? 
     @lists = List.all 
     # somehow only send back the html for the page update 
     render :layout => false 
     else 
     redirect_to root_path 
     end 
    else 
     @lists = List.all 
     render :index 
    end 
    end 

    def update 
    @list = List.find(params[:id]) 
    if @list.update(list_params) 
     render 
    else 
     render 'list/show' 
    end 
    end 

    def destroy 
    @list = List.find_by(params[:id]) 
    @list.destroy 

    respond_to do |format| 
     format.html { redirect_to lists_path } 
     format.js #rails default: go to views/todos/destroy.js.erb 
    end 
    end 

    private 
    def list_params 
     params.require(:list).permit(:name) 
    end 
end 

и мой текущий файл destroy.erb.js выглядит следующим образом :

var id = "<%= @list.id %>"; 

$("#" + id).slideUp(); 

он работает с помощью AJAX, но он всегда удаляет нижнюю строку первой (в отличие от ид, нажал на) ... Как могу я исправить это?

+1

Вы пытаетесь 'slideUp()' 'в

  • ...
  • ' или вы пытаетесь 'slideUp()', что внутри элемента списка? Я бы попробовал: '$ (" # "+ id) .parent(). SlideUp();' –

    +0

    Когда я вызываю родителя, происходит то же самое. Я хочу, чтобы div с Id list.id скользил вверх. Прямо сейчас, независимо от того, где я нажимаю, последний элемент на странице скользит вверх. Мне интересно, связано ли это с моим индексом list = List.order ("created_at DESC"). – Becca

    ответ

    2

    Может быть, попробовать что-то подобное в вашем регуляторе,:

    def destroy 
        list = List.find_by(params[:id]) 
        list.destroy 
        @list_id = params[:id] 
    
        respond_to do |format| 
        format.html { redirect_to lists_path } 
        format.js #rails default: go to views/todos/destroy.js.erb 
        end 
    end 
    

    Тогда в ЯШАХ:

    var id = "<%= @list_id %>"; 
    console.log(id); 
    $("#" + id).slideUp(); 
    

    Вы разрушаете запись, так что я не уверен на 100%, но я не Думаю, вам следует ссылаться на свойства уничтоженных записей. Кроме того, проверьте свою консоль после ее выполнения и убедитесь, что идентификатор - это то, что вы ожидаете.

    +0

    переменная экземпляра должна по-прежнему иметь идентификатор, поэтому в его коде rails нет ничего плохого. – jvnill

    +0

    Это работает! есть ли у вас какие-либо идеи, почему @ list.id не работал раньше? – Becca

    +0

    @ jvnill, спасибо за информацию, я все равно считаю это плохой практикой, ссылающейся на атрибут записи, которую вы уничтожили, нет? @Becca, я не уверен. Вы можете вернуться к старому коду, но держите 'console.log (id)' там и посмотрите, сможете ли вы найти проблему таким образом. Кроме того, я согласен с частью ответа иллюзиониста относительно переменных экземпляра и соответствующим образом обновил свой ответ. Не могли бы вы признать это правильно? –

    1
    def destroy 
        # Its better to have local variable as you are not going to need any 
        # instance variable and minimal @instance variables should be use only if required. They are expensive actually 
        list = List.find_by(params[:id]) 
        list.destroy 
    
        respond_to do |format| 
        format.html { redirect_to lists_path } 
        format.js #rails default: go to views/todos/destroy.js.erb 
        end 
    end 
    

    и views/todos/destroy.js.erb

    console.log(id); 
        // No need to save the id in any instance variable as params is available here as well 
        $("#<%= h params[:id] %>").slideUp('slow', function(){ 
        // Better to delete the record from the DOM 
        $(this).remove(); 
        }); 
    

    Примечание: Вы никогда не должны оказывать params непосредственно в DOM, вы должны бежать вместо строки. http://api.rubyonrails.org/classes/ERB/Util.html#method-c-h

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