2010-10-19 3 views
0

У меня есть метод в моем помощнике приложения, который предназначен для дезактивации задачи в моей базе данных.рельсы: данные удаляются на странице reload

помощник Применение:

def link_to_destroy_task(task_id) 
    Task.find(task_id).deactivate 
    end 

Модель:

def self.deactivate() 
    update_attribute(:active, false) 
end 

Вид:

<ol id="tasks"> 
    <% @Tasks.each do |task| %> 
     <%content_tag_for :li, task do %> 
     <span class ="handle"> [drag] </span> 
     <%= link_to task.name, :controller => "com_tasks", :action => "edit", :id => task.id %> 
     <%= link_to_function '[Delete]', link_to_destroy_task(task.id) %> 
    <% end %> 
    <% end %> 
</ol> 

почему при загрузке страницы она удаляет все из списка. Не только переключение на false. Он полностью вытирается из базы данных.

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

Я изменил имя метода на «деактивировать», потому что я думаю, что уничтожение уже выполнено, но метод все еще выполняется без нажатия. Он больше не удаляется, но он дезактивирует все.

ответ

1

Это происходит потому, что вы вызываете deactivate на ваш взгляд для каждого элемента! Второй параметр для вашей link_to_function выполняет фактическую деактивацию.

Я думаю, что вы недопонимаете link_to_function - при нажатии кнопки она не запускает функцию ruby, она запускает функцию javascript, которую вы создали. Второй параметр должен быть строкой, содержащей функцию javascript. У Rails не было бы способа запустить рубиновый метод в чьем-то браузере.

Вот ссылка на документацию, которая должна получить Вас на правильном пути:

http://apidock.com/rails/ActionView/Helpers/JavaScriptHelper/link_to_function

+0

ОХК. Я первоначально имел это в контроллере, чем я думал, что я должен переместить его в помощника. Есть ли способ создать ссылку на действие в контроллере приложения? Я хотел, чтобы он был доступен из разных представлений от разных контроллеров. И я не думал, что копирование кода было хорошей идеей – Rumpleteaser

1

Обратите внимание на эту линию

<%= link_to_function '[Delete]', link_to_destroy_task(task.id) %> 

Вы фактически исполняющий link_to_destroy_task функции здесь, один раз для каждой задачи.

Из документов

Защиту link_to_function (имя, * арг, & блок)
Возвращает ссылку на данный + имя +, что вызовет функцию JavaScript + + с помощью обработчика OnClick и вернуть НЕВЕРНО факт.

Никогда не использовал этот метод, но его целью является вызов функции JavaScript, а не функции Ruby.
Есть примеры.

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