Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Откуда берётся ... method => :delete... ?


Автор: pupadupa 8.12.2008, 05:59
Добрый вечер.
Начал изучать RoR. Сгенерил простой weblog (по анологии http://ruby.inuse.ru/video-uroki/razrabotka-ruby-rails-prilozhenii-pri-pomoshchi-netbeans ) т.е. просто scaffold Post title:string    . Использую IDE NetBeans

В итоге вижу в файле index.html.erb :
Код

<% for post in @posts %>
  <tr>
    <td><%=h post1title %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>


Вопрос:
почему :method => :delete  ?

хотя в  файле posts_controller.rb записано :
Код

 def destroy
    @post = Post.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
    end

Поиском я нашёл, что есть в проекте файл posts_controller_test.rb и в нём указано:
Код

 test "should destroy post" do
    assert_difference('Post.count', -1) do
      delete :destroy, :id => posts(:one).id
    end


Но я вот не пойму причём тут этот posts_controller_test.rb   ? и где он цепляется у меня ?
Если не сложно, объясните на пальцах принцип.... зачем этот posts_controller_test.rb  , где он цепляется, почему нельзя использовать :method => :destroy (ошибку сервера выдаёт)  ???

Спасибо.

Автор: shine 8.12.2008, 15:27
posts_controller_test.rb - файл с автоматическими тестами для контроллера PostsController. Создается он, насколько я помню, при генерации контроллеров через ruby script/generate. Цепляется он при запуске функциональных тестов или при запуске всех тестов сразу.

delete - это HTTP заголовок, а destroy - это интерфейс ресурса Post. То есть это принципиально разные вещи.

Автор: pupadupa 8.12.2008, 15:47
Спасибо. Буду разбираться дальше.

а нет какой-нить ссылочки чтобы почитать про это? в гугле найти не могу.

Просто как-то странно: создался (при автоматической генерации) класс PostsControllers  в нём определён метод destroy, а во вьюхе index.html.erb этот destroy не задействован, а используется delete, который вообще непонятно что такое.


Нашёл другой пример (http://www.tutorialspoint.com/ruby-on-rails-2.1/rails-controllers.htm), в нём всё создаётся вручную (без автоматической генерации) и  в этом примере всё понятно:
1)
Есть book_controller.rb
Код

   def delete
      Book.find(params[:id]).destroy
      redirect_to :action => 'list'
   end

2)
А потом делается view, которая вызывает метод :delete
Creating view file for delete method:
Код

<li>
<%= link_to c.title, {:action => 'show', :id => c.id} -%>
<b> <%= link_to 'Edit', {:action => 'edit', :id => c.id} %></b>
<b> <%= link_to "Delete", {:action => 'delete', :id => c.id},
:confirm => "Are you sure you want to delete this item?" %></b>
</li>


Почему при автоматической генерации не так полчается? Очень запутанно как-то. Хочется разобраться детально, в чём разница подходов, в чём плюсы/минусы, почему при автоматической генерации делается так запутанно (как мне показалось) и как это всё работает.

Спасибо!

Автор: shine 8.12.2008, 16:10
Почитайте про ресурсы и их реализацию в Rails. Вот неплохая статья: http://www.taknado.com/2007/8/31/rest-on-rails

Если нужно очень кратко, то посмотрите 7-ю страницу здесь: http://media.rubyonrails.org/presentations/worldofresources.pdf

Автор: pupadupa 8.12.2008, 18:29
Спасибо огромное за ссылки!!!!

Начинает прояснятся картина.

я так понял, что в этой строчке
Код

  <td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>

delete это как раз передоваемый от клиента к серверу HTTP заголовок, а не метод класса (как я подумал). Т.о. получается, что ресурсу (в http://www.taknado.com/2007/8/31/rest-on-rails) передаётся:
url (ссылка по которой мы переходим) + DELETE (в HTTP заголовке)  и ресурс отвечает на это  методом DESTROY (метод описанный в контроллере).

Я правильно понял?


З.Ы. мда... интересный подход! если честно я про HTTP то и не думал никогда

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)