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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

970閲覧

Railsで中間テーブルに値が入らない泣

CodeRascal

総合スコア8

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Ruby

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

1クリップ

投稿2020/02/05 15:08

編集2020/02/05 22:55

自分で書いた記事に、参考にした記事のタイトルやURLをスクレイピングして持ってきたい。

初めまして、rails初学者です。
現在ポートフォリオ作成の一環として、次のようなWebアプリを作成しています。

自分が気になった記事やニュースなどについて、自分の考えを記事にして投稿できる! 引用を書くのがめんどくさくても大丈夫、参考サイトのURLを入力すると自動でタイトルとURLを引用元として追加してくれます。

想定している入力フォームはこんな感じです。
想定している入力フォーム

これまで実装した範囲で

  • スクレイピングしたタイトルとURL、アイキャッチ画像をDBに保存できる
  • 作成した記事をDBに保存できる

までは達成したのですが、作成した記事とスクレイピングしたデータとの紐付け方がわかりません。

##試みたこと

railsは複合主キーに対応していないとのことで、多対多のモデルとみなして中間テーブルを作成しました。

記事の内容、スクレイピングした内容はそれぞれのDBに入ってくれるのですが、中間テーブルに値が入ってくれません

###理想のモデル
(articlesテーブル)→ユーザーが書く記事の内容を保存する
|id|title|text|user_id|
|:--|:--:|--:|
|1|食糧危機について|近年〜|1|
|2|日本経済の行方|少子高齢化が〜|2|

(article_scrapesテーブル)→articlesテーブルとscrapesテーブルの中間テーブル

idarticle_idscrape_id
111
212
323

(scrapesテーブル)→URL入力フォームに入力されたURLをスクレイピンしたデータを保存する
|id|url|title|image_url|user_id|
|:--|:--:|--:|
|1|https://〜|アフリカの食糧危機深刻化。|https://〜|1|
|2|https://〜|アフリカを巡る世界情勢。|https://〜|1|
|3|https://〜|日経平均株価の10年を振り返る|https://〜|1

##書いたコード

【Model】

ruby:app>model>article.rb

1class Article < ApplicationRecord 2 belongs_to :user 3 has_many :comments 4 5 has_many :article_scrapes 6 has_many :scrapes, through: :article_scrapes 7end

ruby:app>model>article_scrape.rb

1class ArticleScrape < ApplicationRecord 2 belongs_to :article 3 belongs_to :scrape 4end 5

ruby:app>model>scrape.rb

1class Scrape < ApplicationRecord 2 has_many :article_scrapes 3 has_many :articles, through: :article_scrapes 4end

【コントローラー】

ruby:app>controllers>articles_controller.rb

1class ArticlesController < ApplicationController 2 require 'nokogiri' #import宣言 3 require 'open-uri' 4 5 before_action :move_to_index, except: [:index, :show] 6 7 def index 8 @articles = Article.includes(:user).order("created_at DESC") 9 end 10 11 def new 12 end 13 14 def create 15 url = article_params[:url] #scraping対象URL 16 charset = nil 17 html = crawling(url) 18 19 doc = Nokogiri::HTML.parse(html, nil, charset) 20 title = doc.title 21 image_url = doc.css('img').attribute('src').value 22 scrape = insert_scrape(url, title, image_url) 23 article = scrape.articles.build(article_params) 24 end 25 26 def show 27 @article = Article.find(params[:id]) 28 @comments = @article.comments.includes(:user) 29 end 30 31 def destroy 32 article = Article.find(params[:id]) 33 article.destroy if article.user_id == current_user.id 34 end 35 36 def edit 37 @article = Article.find(params[:id]) 38 end 39 40 def update 41 article = Article.find(params[:id]) 42 if article.user_id == current_user.id 43 article.update(article_params) 44 end 45 end 46 47 private 48 49 def article_params 50 params.permit(:url, :title, :text) 51 end 52 53 def move_to_index 54 redirect_to action: :index unless user_signed_in? 55 end 56 57 def insert_scrape(url, title, image_url) 58 scrape = Scrape.new( 59 :url => url, 60 :title => title, 61 :image_url => image_url 62 ) 63 scrape.save! 64 end 65 66 def insert_article(title, text, user_id,random_id) 67 article = Article.new( 68 :title => title, 69 :text => text, 70 :user_id => user_id, 71 :random_id => random_id 72 ) 73 article.save! 74 75 end 76 77 def crawling(url) 78 open(url) do |f| 79 charset = f.charset 80 f.read 81 end 82 end 83end 84

発生している問題・エラーメッセージ

イメージ説明

補足情報

  • ruby 2.5.1p57
  • Rails 5.2.4.1

長々とお読みいただきありがとうございました。

解決策、並びに代替案などございましたら(優しく)回答いただけると嬉しいです。

よろしくお願いいたします。

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

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

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

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

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

winterboum

2020/02/05 21:10

エラー画面のcreateと載せているcontrollerの内容が違っています。 エラーが起きた時のプログラムを載せてください
guest

回答1

0

ベストアンサー

def insert_scrape(url, title, image_url) scrape = Scrape.new( :url => url, :title => title, :image_url => image_url ) scrape.save! scrape # <--- 追加 end

投稿2020/02/06 03:21

winterboum

総合スコア23567

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

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

CodeRascal

2020/02/06 14:46 編集

回答ありがとうございました! おっしゃる通り、追記することでうまく動作致しました! (その他、ぬるぽが起きていたためうまくいきませんでしたがなんとか解消できました!) 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問