0

Rails 3ガイドに従ってRailsを学んでいます。

ブログアプリケーションは実行されましたが、コメントを編集可能にし、更新を行い、フォームを作成し、両方を投稿ページに表示したいと考えています。そのため、次の変更を行います。

post.show.htm.erb:

<h2>Comments</h2>
<% @post.comments.each do |comment| %>
  <tr>
    <td><%= comment.commenter %></td>
    <td><%= comment.body %></td>
    <td><%= link_to 'Edit', edit_post_comment_path(@post,comment) %></td>
    <td><%= link_to 'Destroy', post_comment_path(@post,comment), confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>

<h2>Add a comment:</h2>

#here,I can not set the form_for property.
<%= form_for([@post,@comment],:url=>post_comment_path) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

コントローラーコントローラー:

class CommentsController < ApplicationController
  # GET /posts/1/comments/1/edit
  def edit
    #render json: params
    @post=Post.find(params[:post_id])
    @comments=Comment.all
    @comment = Comment.find(params[:id])
    render "/posts/show"
  end

  #other action omitted

  def show
    # I donot know what to do here
  end
end

ただし、リンクにアクセスできません:

http://localhost:3000/posts/1

エラーが発生します:

No route matches {:action=>"show", :controller=>"comments"}

実際、ご覧のとおり、CommentController に show アクションがあります。

そして、なぜcomments#showアクションにアクセスするのだろうか?

これは私のルートです:

    post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                  POST   /posts/:post_id/comments(.:format)          comments#create
 new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
     post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                  PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                  DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
            posts GET    /posts(.:format)                            posts#index
                  POST   /posts(.:format)                            posts#create
         new_post GET    /posts/new(.:format)                        posts#new
        edit_post GET    /posts/:id/edit(.:format)                   posts#edit
             post GET    /posts/:id(.:format)                        posts#show
                  PUT    /posts/:id(.:format)                        posts#update
                  DELETE /posts/:id(.:format)                        posts#destroy
       home_index GET    /home/index(.:format)                       home#index
             root        /                                           home#index

/posts/:idがトリガーされposts#showます。なぜcomments#show

4

1 に答える 1

0

投稿を編集する必要がある場合は、追加します

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

def update
  @post = Post.find(params[:id])
  if @post.update_attributes(params[:post])
    redirect_to some_path and return
  end
  render 'edit' #error
end

編集用のフォームは、サーバーにPUTリクエストを送信する必要があります。railsは、routesファイルを使用してURLとリクエスト(GET / POST / PUT / DELETEなど)をコントローラーアクションにマップします。

ここ

PUT    /posts/:id(.:format)                        posts#update

リクエストはPUT、コントローラーはPostsController、アクションはupdateです。

また、

post GET    /posts/:id(.:format)                        posts#show

POST / PUT / DELETEの場合、フォームからhttpリクエストを渡す必要があります。あなたは「編集」のためにそうすることができます

<%= form_for([@post,@comment],:url=>post_comment_path, :method => :put) do |f| %>

PostsControllerのshowリクエストにマップします。形式はデフォルトでhtmlです。詳細については、サーバーログをご覧ください。

于 2012-09-06T09:31:04.757 に答える