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

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

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

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

Ruby

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

2回答

25130閲覧

no implicit conversion of nil into Stringの原因わかる方いらっしゃいますか。

lilywhite

総合スコア42

Ruby on Rails 5

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

Ruby

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

1グッド

1クリップ

投稿2019/01/27 08:36

編集2019/01/27 08:51

今、過去のツイートから川柳を作成するアプリを作っています。
アプリの仕組みは大方仕上がったのですが、肝心のツイートを文章化して分析する部分がうまくいきません。エラーが出てうまくいきません。

分析するテキストを引数として直接渡す場合はうまくいくのですが、取得したツイートを.joinとし文章化して引数として渡すとうまくいきません。

このエラーの原因や動作の差異がわかる方いらしましたら教えていただきたいです

error

1no implicit conversion of nil into String

senryu.rb

1 noun = node.surface 2 index = @sent.index(noun) 3error=> read_word = "#{@kana[index]}" + @kana[index + 1] 4 # 文字数を数える 5 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 7 6 middle = @sent[index] + @sent[index + 1] 7

ツイートを取得します

tweet.rb

1require 'twitter' 2class Tweet 3 attr_accessor :uid 4 include ActiveModel::Model 5 def initialize(uid) 6 @uid = uid 7 end 8 9 def get_tweet 10 tweets = [] 11 client = client_new 12 @timeline = client.user_timeline(uid) 13 @timeline.each do |tweet| 14 tweets.push(tweet.text) 15 end 16 return tweets 17 end 18 19 private 20 def client_new 21 Twitter::REST::Client.new do |config| 22 config.consumer_key = ENV['APP_ID'] 23 config.consumer_secret = ENV['APP_SECRET'] 24 config.access_token = ENV['ACCESS_TOKEN'] 25 config.access_token_secret = ENV['ACCESS_SECRET'] 26 end 27 end 28end

テキストを575の川柳の形に変えて戻す記述です

senryu.rb

1 require 'active_model' 2 require 'mecab' 3 require 'twitter' 4 class Senryu 5 attr_accessor :text 6 include ActiveModel::Model 7 8 def initialize(text) 9 @text = text 10 end 11 12 def parse 13 -- テキストを分析する基本形 14 @sent = [] 15 mecab = MeCab::Tagger.new("-Ochasen") 16 node = mecab.parseToNode(text) 17 while node 18 @sent.push(node.surface) 19 node = node.next 20 end 21 22 -- @snetのカタカナver. 23 @kana = [] 24 mecab = MeCab::Tagger.new("-Ochasen") 25 node = mecab.parseToNode(text) 26 while node 27 @kana.push(node.feature.split(",")[7]) 28 node = node.next 29 end 30 31 -- 指定した品詞で始まる単語を取り出し、隣の言葉と結合させる 32 -- 川柳に使う候補となる言葉たち 33 @first = [] 34 mecab = MeCab::Tagger.new("-Ochasen") 35 node = mecab.parseToNode(text) 36 37 while node 38 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 39 |^接続詞|^感動詞|^接頭詞|$接頭詞/ =~ node.feature.split(/,/)[0] 40 noun = node.surface 41 index = @sent.index(noun) 42 read_word = @kana[index].to_s + @kana[index + 1].to_s 43 -- 文字数を数える 44 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 5 45 first = @sent[index] + @sent[index + 1] 46 @first.push(first) 47 end 48 end 49 node = node.next 50 end 51 @first_word = @first.sample 52 -- 指定した品詞で始まる単語を取り出し、隣の言葉と結合させる 53 -- 川柳に使う候補となる言葉たち 54 @middle = [] 55 mecab = MeCab::Tagger.new("-Ochasen") 56 node = mecab.parseToNode(text) 57 58 while node 59 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 60 |^接続詞|^感動詞|^接頭詞|$接頭詞/ =~ node.feature.split(/,/)[0] 61 noun = node.surface 62 index = @sent.index(noun) 63 read_word = "#{@kana[index]}" + @kana[index + 1] 64 -- 文字数を数える 65 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 7 66 middle = @sent[index] + @sent[index + 1] 67 @middle.push(middle) 68 end 69 end 70 node = node.next 71 end 72 @middle_word = @middle.sample 73 74 @last = [] 75 mecab = MeCab::Tagger.new("-Ochasen") 76 node = mecab.parseToNode(text) 77 78 while node 79 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 80 |^接続詞|^感動詞|^接頭詞|^接頭詞/ =~ node.feature.split(/,/)[0] 81 noun = node.surface 82 index = @sent.index(noun) 83 read_word = "#{@kana[index]}" + @kana[index + 1] 84 -- 文字数を数える 85 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 5 86 @sent[index + 1] 87 last = @sent[index] + @sent[index + 1] 88 @last.push(last) 89 end 90 end 91 node = node.next 92 end 93 @last_word = @last.sample 94 95 senryu = @first_word + @middle_word + @last_word 96 return senryu 97 end 98 end

controllerでの呼び出し?の記述です

class TweetsController < ApplicationController def get uid = User.where(current_user.uid) @tweet = Tweet.new(uid) @tweets = @tweet.get_tweet.join @senryu = Senryu.new(@tweets) @output = @senryu.parse end end

なにかわかる方いらしましたら教えていただきたいです。


ちなみにエラーの個所の記述を
read_word = @kana[index] + @kana[index + 1]とするとエラーが
undefined method `+' for nil:NilClassに代わりました。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

read_word = "#{@kana[index]}#{@kana[index + 1]"
での、エラーは解消できるとおもいます。

でも根本の原因は kana[index] が nil になっていることです。
この状態が正しいなら良いのですが、
kana[index] や kana[index + 1] が nil になるはずがないのなら、コードを見直ししてそれを解消する必要があります。
そうしないと、エラーはおこっていないのに結果が思ったとおりになっていないという状況になります。

投稿2019/01/27 09:47

katoy

総合スコア22324

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

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

0

自己解決

read_word = @kana[index].to_s + @kana[index + 1].to_sと記述し
文字列として返すと明示したところエラーが解消されました

投稿2019/01/27 08:54

lilywhite

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問