前提・実現したいこと
ユーザーの投稿に対するコメント機能を実装し終えました。
このコメント機能に対する文字数制限とエラーメッセージを以下の様に設定しています。
comment.rb
class Comment < ApplicationRecord validates :body, {presence: true, length: {maximum: 100}} belongs_to :user belongs_to :post end
posts/show.html.erb
<% @comment.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <div class="post-show-comment-field"> <%= form_for([@post, @comment]) do |f| %> <%= f.text_area :body, :placeholder => "Write a comment…", :rows => 3, :cols => 80 %> <%= f.submit "Comment" %> <% end %>
comments_controller.rb
class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) @post = @comment.post if @comment.save @post.create_notification_comment!(@current_user, @comment.id) redirect_back(fallback_location: post_comments_path) else @user = @post.user render ("posts/show") end end end
これで一応動きはするのですが、ルーティング周りの仕組みがよく分かりません。
同じcomments_controllerのcreateアクションを動かすのでも、
redirect_back(fallback_location: post_comments_path)
とすると posts/#{@post.id}
に、
render ("posts/show")
とすると posts/#{@post.id}/comments
と、
別々のルーティングにそれぞれレンダリングされますが、この理由がよく分かりません。
(個人的には、 render
の際にも redirect_back
の時同様 posts/#{@post.id}
にレンダリングして欲しかったです。)
redirectは別のリクエストを出す(元のコントローラ --> ルーティング --> コントローラ --> ビュー)のに対して、
renderは指定したビューを表示するのみ。(元のコントローラ --> 指定したビューファイル )
と言う事は学んだのですが、まだモヤっとしています。
どなたかご教授いただければ幸いです。
補足
文字数制限自体に関しては、そもそもビューにて以下の様に :maxlength => 100
を記述する事で解決出来たので、こちらで実装しようかと思っています。
ただ上記の様にモデルにてバリデーション関連を組み立てていた際にどうしても腑に落ちない部分がありましたので、質問させて頂きました。
posts/show.html.erb
<%= form_for([@post, @comment]) do |f| %> <%= f.text_area :body, :placeholder => "Write a comment…", :rows => 3, :cols => 80, :maxlength => 100 %> <%= f.submit "Comment" %> <% end %>
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
追記
routes.rb
get "posts/:id" => "posts#show" resources :posts do resources :comments, only: [:create, :destroy] end
rails routesの結果
Prefix Verb URI Pattern Controller#Action post GET /posts/:id(.:format) posts#show PATCH /posts/:id(.:format) posts#update PUT /posts/:id(.:format) posts#update post_comments POST /posts/:post_id/comments(.:format) comments#create
回答2件
あなたの回答
tips
プレビュー