2014-07-18 12 views
5

Tôi có đoạn mã sau nhưng tôi không thể hiểu được việc định tuyến nào xảy ra cho form_for ([@ article, @ article.comments.build]). Ruby on Rails Form Với hai tham số

Title: <% = @ article.title%>

<p> 
     <strong>Text:</strong> 
     <%= @article.text %> 
    </p> 

    <h2>Add a comment:</h2> 
    <%= form_for([@article, @article.comments.build]) do |f| %> 
     <p> 
     <%= f.label :commenter %><br> 
     <%= f.text_field :commenter %> 
     </p> 
     <p> 
     <%= f.label :body %><br> 
     <%= f.text_area :body %> 
     </p> 
     <p> 
     <%= f.submit %> 
     </p> 
    <% end %> 

    <%= link_to 'Back', articles_path %> 
    | <%= link_to 'Edit', edit_article_path(@article) %> 

Trả lời

3

Rails có thể bao hàm các tuyến đường từ form_for

ví dụ

<%= form_for(@article) do |f| %> 
... 
<% end %> 

Nếu @article là mới và không có trong cơ sở dữ liệu, sau đó đường ray có thể suy ra bạn đang tạo một hình mới, sau đó con đường sẽ là

articles_path(@article), action: :create 

Nếu @article đã tồn tại trong cơ sở dữ liệu sau đó đường ray có thể suy ra bạn đang chỉnh sửa một đối tượng hiện có, vì vậy đường dẫn là.

article_path(@article), action: :update 

Điều này áp dụng cho các tuyến đường lồng nhau cũng như mã ví dụ bạn có.

<%= form_for([@article, @article.comments.build]) do |f| %> 

Nó biết con đường cha mẹ là bài viết và các tuyến đường phụ là ý kiến, vì nó là một lời nhận xét mới, tuyến đường sẽ

article_comments_path(@article, @article.comments.build), action: :create 

Nếu bình luận tồn tại thì nó sẽ là một hành động cập nhật

article_comment_path(@article, @comment), action: :update 

Bất kỳ form_for, link_to, v.v ... đều có thể ngụ ý đường dẫn từ các đối tượng.

+0

Giải thích thực sự tốt. – Niyanta

2

Để làm điều đó, bạn sẽ phải có các lời nhận xét được lồng trong bài viết của mình. Vì vậy, tập tin rout của bạn sẽ có một cái gì đó như thế này

resources :article 
    resources :comments 
end 

Điều này tạo ra một số tuyến đường, một trong những hình thức này sẽ đi nó là

POST /posts/:post_id/comments 

Và trong helper form_for form_for([@article, @article.comments.build]) kể hình thức để gửi đến rout mà