2014-02-24 4 views
2
  1. Я делаю учебник в Rails блога и не в полной мере понять следующее LINK_TO кодRuby on Rails link_to объяснение для n00b?

    <%= link_to 'Destroy Comment', [comment.post, comment], 
         method: :delete, 
         data: { confirm: 'Are you sure?' } %> 
    

    Почему я должен использовать:

    [comment.post, comment] 
    

    и почему я не могу просто написать:

    @post.comment 
    
  2. Мой второй, связанный, вопрос заключается в том, что, так как я создал действие «уничтожить» в контроллере следующим образом:

    def destroy 
        @post = Post.find(params[:post_id]) 
        @comment = @post.comments.find(params[:id]) 
        @comment.destroy 
        redirect_to post_path(@post) 
    

    конец

    Почему я не должен упомянуть «уничтожить» в коде link_to?

    <%= link_to 'Destroy Comment', [comment.post, comment], 
        method: :delete, 
        data: { confirm: 'Are you sure?' } %> 
    

ответ

2

Причина, почему вы должны поставить как объект Post и Комментарий к помощнику link_to потому, что комментарий является вложенной ресурс в сообщении, и оба идентификаторы должны быть известны для построения URL , Это на самом деле эквивалентно:

link_to 'Destroy Comment', post_comment_path(comment.post, comment), ...

Что это делает, это разрешение помощника пути для вас, используя url_for. См. http://guides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects.

Вы не должны упоминать уничтожение в своем link_to, потому что уничтожение - это имя действия. В вашем файле маршрутов указывается, какие контроллеры и действия связаны с маршрутами.

Я предполагаю, что вы используете находчивую маршрутизацию, которая является сокращенным способом определения маршрутов для всех действий CRUD. См. http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions для сопоставления между HTTP-глаголом и действием контроллера. Вы увидите, что delete сопоставляется с destroy, и вы используете method: :delete на своем link_to.

1

Таким образом, здесь многое происходит.

1) Мое предположение, что link_to в первой части находится внутри цикла. Это правда? Это было бы что-то вроде @post.comments.each do |comment|. Если это так, то вероятность того, что происходит, у вас есть комментарии, вложенные в сообщения. Эта документация может быть найдена here. Скобки должны идентифицировать комментарий, для которого вам нужен идентификатор post. Возможно, вы также можете сделать [@post, comment], что будет работать так же хорошо. Вы не можете просто написать @post.comment, потому что недостаточно информации для определения правильного комментария.

2) Rails принимает HTTP-глаголы, чтобы определить, какое действие вызывать с контроллера. Вы отправляете запрос HTTP DELETE на /posts/:post_id/comments/:id, который затем определяет файл маршрутов, который принадлежит контроллеру комментариев. Эта документация может быть найдена here и here.

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