ニュース記事に関するコメント機能を作ろうと思っています。ユーザーにのみコメントができるように、その記事の詳細画面へと飛んだ後にコメントできるフォームを作っていたのですが、NameErrorが出てshowのパスが紐付けられていない状態です。
試しに「link_to」のヘルパーメソッドの箇所に「url: /news/show」を記述してみましたが、トップページに止まるだけで、変化がありませんでした。
仮説と致しましては、ルーティングのresoucesメソッドにshowアクションが読み取れていないからだと考えていますが、ルーティングのネストをしている以上は記述できません。
どなたか修正箇所が多々あると思うので、見てもらえますでしょうか?恐れ入りますが、ご指摘お待ちしております。
ターミナル news_comments GET /news/:news_id/comments(.:format) comments#index POST /news/:news_id/comments(.:format) comments#create news_index GET /news(.:format) news#index POST /news(.:format) news#create new_news GET /news/new(.:format) news#new edit_news GET /news/:id/edit(.:format) news#edit news GET /news/:id(.:format) news#show PATCH /news/:id(.:format) news#update PUT /news/:id(.:format) news#update DELETE /news/:id(.:format) news#destroy
config/routes.rb Rails.application.routes.draw do devise_for :users root "news#index" resources :news do collection do get 'seach' end resources :comments, only: [:index,:create] end end
app/controllers/news_controller.rb class NewsController < ApplicationController require "open-uri" def index news_api_key = ENV["NEWS_API_KEY"] uri = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=#{news_api_key}" article_serialized = open(uri).read @articles = JSON.parse(article_serialized) end def show news_api_key = ENV["NEWS_API_KEY"] uri = "http://newsapi.org/v2/top-headlines?country=jp&apiKey=#{news_api_key}" article_serialized = open(uri).read @articles = JSON.parse(article_serialized) @comment = Comment.new end end
app/views/news/index.html.rb <main class="main"> <div class="inner"> <% if user_signed_in? %> <div class="greeting"> <%= link_to current_user.name, class: :greeting__link%> </div> <% end %> </div> <header> <p class="font">Powered by <a href="https://newsapi.org", class="btn">News API</a></p> </header> <div class="articles"> <% @articles["articles"].each do |article| %> <div class="article"> <div class="title"> <%= link_to article["title"], article["url"] %> </div> <div class="wrapper"> <div class="date"> <%= article["publishedAt"] %> </div> <div class="source"> <%= article["source"]["name"]%> </div> <div class="image"> <%= image_tag article["urlToImage"] || '#', :size =>'240x160' %> </div> <div class="content"> <%= article["description"] %> </div > <% if user_signed_in? %> <div class="comment"> <%= link_to "コメントする", news_path(news.id)%> #この部分になります </div> <% end %> </div> </div> <% end %> </div> </main>
app/views/news/show.html.rb <main class="main"> <div class="inner"> <div class="articles"> <%= @articles["articles"] %> <div class="article"> <div class="title"> <%= link_to article["title"], article["url"] %> </div> <div class="wrapper"> <div class="date"> <%= article["publishedAt"] %> </div> <div class="source"> <%= article["source"]["name"]%> </div> <div class="image"> <%= image_tag article["urlToImage"] || '#', :size =>'240x160' %> </div> <div class="content"> <%= article["description"] %> </div > </div> </div> </div> <ul class="comments_lists"> <% @comments.each do |comment| %> <li class="comments_list"> <%= comment.text%> <%= link_to "(#{comment.user.name})", news_comments_path, class: :comment_user %> </li> <% end %> </ul> </div> </main>
app/controllers/comments_controller.rb class CommentsController < ApplicationController def index @comments = Comment.all.order(id: "DESC") end def create @comment = Comment.new(comment_params) end private def comment_params params.require(:comment).parmit(:text).merge(user_id: current_user.id) end end
app/models/comment.rb class Comment < ApplicationRecord belongs_to :user validates :text, presence: true end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/09 10:00
2021/01/09 10:32 編集
2021/01/09 11:06
2021/01/10 07:11
2021/01/10 09:04 編集
2021/01/11 08:41
2021/01/11 13:12 編集
2021/01/12 03:45 編集
2021/01/12 08:50