質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

301閲覧

記事に関するコメント機能を実装したい。

murohi-08

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/01/07 06:47

編集2021/01/09 12:23

ニュース記事に関するコメント機能を作ろうと思っています。ユーザーにのみコメントができるように、その記事の詳細画面へと飛んだ後にコメントできるフォームを作っていたのですが、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずこちらを見て下さい

news GET /news/:id(.:format)

これが今回murohi-08さんが使用されてエラーになっているnews_pathのルーティングです。

右側の、/news/:id というのが、パスになるのですが、これはidという引数が必要であることを表現しています。
ですので、このルーティングを使用したければ、news_path(id: ニュースのid)という書き方をする必要があります。

このidがなければ、どのnewsの詳細画面に行けばよいのか、railsもわからなくて困っているのです。

投稿2021/01/08 13:19

編集2021/01/08 13:20
siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murohi-08

2021/01/09 10:00

ご回答ありがとうございます。返事が遅くなり恐れ入ります。news_path(news.id)を記述してみましたが、今度はNameErrorが出てしまいました。こうなればコードの記述違いになりますから、何かしら記述が不足しているからでしょうか? 恐縮ですがご教授いただけますでしょうか?よろしくお願いします。
siruku6

2021/01/09 10:32 編集

NameErrorの詳しい内容と、実際に書いたコードを追記してみてもらえますか?? いまいち状況がつかめていません。 (できればコメント欄ではなく質問文欄の方に...)
murohi-08

2021/01/09 11:06

大変失礼しました。修正いたしましたのでよろしくお願いします。
siruku6

2021/01/10 07:11

`news`がないw これはさすがに動かないですよね! `news`という変数を呼び出したければ、どこかで宣言しないといけませんので。 ちなみに、newsとarticleは何か関係があるのでしょうか? news_path()にはidを渡せばよいのですが、newsというモデルがそもそもなければnewsのidも何もないと思います。 もしかしたらですが、articleとnewsは同じもののつもりなのではないのかと不安になってきましたが、いかがでしょう...?
murohi-08

2021/01/10 09:04 編集

返信ありがとうございます。ディレクトリをnewsではなくarticleに変えてみましたが、予想通りNomethodErrorが出てしまい、ariticleそのものがnilになってしまいます。 今回の個人開発での実装はAPIを使用したニュースサイトになりますので、モデルは扱っていません。モデルはDBとのやりとりをする際に必要になるオブジェクトですので、コメント機能を作るためCommentモデルだけにしておきました。 ニュース記事(article)に関するデータ保存はしませんので、モデルは必要ないと判断した次第です。
siruku6

2021/01/11 08:41

>モデルはDBとのやりとりをする際に必要になるオブジェクトですので、コメント機能を作るためCommentモデルだけにしておきました。 なるほど。 railsでidというのは、基本的にDBに入っているレコード一つ一つに割り振られるものです。 なので、DBにnewsを保存しないのであれば、news_pathに渡すべきidはシステム上に存在しません。 そうなってくると、routingや設計を見直した方がいいかもしれません。 DBに存在しないnewsを複数表示する方法としては何を検討されているのでしょうか? 画面を表示するたびにnewsをスクレイピングなどで取得しに行くのでしょうか?(←この方法はあんまりよくなさそう)
murohi-08

2021/01/11 13:12 編集

ありがとうございます。そうですね。やっぱり画面遷移する上でスクレイピングは難しいですかね?一つのページだけにして、コメント機能はJSで実装した方がよろしいですかね? 解決しないままで何度も申し訳ありません。お教えいただければ幸いです。
siruku6

2021/01/12 03:45 編集

長くなってしまったので結論だけ先に。 コメントする画面に行く際にスクレイピングしなければ、とりあえず設計上は問題なさそうです。 この場合はJSで実装するとか考えなくても大丈夫です。 ----------------- 【理由など】 遊び以外でスクレイピングしたことがないので、スクレイピングに関する細かいルールなどはよくわからないのですが、少なくともwebアプリケーションは多数の人がある程度アクセスしてくることを想定するものだと思います。 なので、アクセスされる度に毎回同じサイトに対してスクレイピングしたら完全に迷惑行為になりそうです....。 (1回取れば済むものを何度もリクエストするのは、処理時間の無駄のような気もします。) そもそも1回スクレイピングすることすら禁じているサイトもあると思うので、仮に許容しているサイトだとしても、管理者が手動で実行するとか、日に1回定時実行するとか、そういう形にしてあげた方がよいと思います。 スクレイピングは相手のサイトに負荷がかかる行為のため。 ただ、今勉強中で、自分以外は絶対そのサイトにアクセスしないのであれば....アクセスの度に毎回スクレイピング、でもいいのかもしれません....(もちろん、許可しているサイトのみ)
murohi-08

2021/01/12 08:50

ありがとうございます。わかりました。スクレイピングはいろいろルールがありそうですね。 ご教授ありがとうございました!助かりました!感謝します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問