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

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

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

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

Ruby on Rails

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

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

1回答

362閲覧

モデルから取得した変数を、public配下のrbファイルに渡したい

naoya.n

総合スコア26

Ruby

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

Ruby on Rails

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

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

0クリップ

投稿2018/06/02 08:49

編集2018/06/03 06:03

RailsとRMagickを使って画像にテキストを加工するアプリケーションを作っています。
publicに置いたtest2.pngという画像にコントローラからrmagick.rbを実行するものを作りました。song.rb, translation.rb, lyric.rbというモデルから取得したデータをSongsControllerというコントローラからpublic配下のrmagickに、変数を渡したいです。
グローバル変数を作って見たのですが、rmagickでうまく取得できません。
どうすればpublic/rmagick.rbで、モデルのデータをSongsControllerを介して取得できるでしょうか。

現状、直で書いた文字列だとうまく動くところまでは確認してます。

public/rmagick.rb

ruby

1require 'fileutils' 2require 'RMagick' 3 4# メッセージ 5MSG_USAGE = "USAGE: ruby rmagick.rb filename" 6MSG_NOT_EXIST = "File not exist!" 7 8class Arg 9 # 引数取得 10 def get_arg 11 begin 12 if ARGV[0] 13 # ファイルが存在しなければ終了 14 unless File.exist?(ARGV[0]) 15 puts MSG_NOT_EXIST + " #{ARGV[0]}" 16 exit 17 end 18 else 19 # 引数無ければ終了 20 puts MSG_USAGE 21 exit 22 end 23 24 # ファイル名返却 25 return ARGV[0] 26 rescue => e 27 STDERR.puts "[ERROR][#{self.class.name}.get_arg] #{e}" 28 exit 1 29 end 30 end 31end 32 33class Rmagick 34 35 def initialize(filename) 36 @img_file = filename 37 end 38 39 # テキスト描画 40 def rmagick(columns = 5) 41 FileUtils.cp(@img_file, "2"+@img_file, {:preserve => true}) # 元画像退避 42 img = Magick::ImageList.new(@img_file) # 画像オブジェクト 43 draw = Magick::Draw.new # 描画オブジェクト 44 45 46   #ここで変数を受け取りたい!!!! 47 str = $translation_img 48 str2 = $lyric_img 49 str3 = $title_img 50 51 begin 52#ここに変数を代入したい!!!!!! 53 draw.annotate(img, 0, 0, 70, 320, str3.scan(/.{1,#{30}}/).join("\n")) do 54 55 self.fill = 'white' 56 self.stroke = 'transparent' 57 self.pointsize = 24 58 self.gravity = Magick::NorthWestGravity 59 end 60 61 draw.annotate(img, 0, 0, 70, 165, str2.scan(/.{0,44}[a-z.!?,;](?:\b|$)/mi).join("\n") ) do 62 self.fill = 'white' 63 self.stroke = 'transparent' 64 self.pointsize = 44 65 self.gravity = Magick::NorthWestGravity 66 end 67 68 draw.annotate(img, 0, 0, 68, 55, str) do 69 70 self.fill = 'white' 71 self.stroke = 'transparent' 72 self.pointsize = 24 73 self.gravity = Magick::NorthWestGravity 74 end 75 76 # 画像生成 77 img.write("2"+@img_file) 78 rescue => e 79 STDERR.puts "[ERROR][#{self.class.name}.rmagick] #{e}" 80 exit 1 81 end 82 end 83end 84 85# 引数取得 86obj_arg = Arg.new 87filename = obj_arg.get_arg 88 89# Copyright 描画 90obj_main = Rmagick.new(filename) 91obj_main.rmagick

SongsController.rb

ruby

1 2 def share 3 4 @translation= Translation.find_by(id: params[:id]) 5 @lyric = Lyric.find_by(number: @translation.number , song_id:@translation.song_id) 6 @song = Song.find_by(id: @translation.song_id) 7 #インスタンス変数をモデルから取得 8 9  #これをグローバル変数にしてrmagick.rbに渡したい 10 $translation_img = @translation.content 11 $lyric_img = @lyric.content 12 $artist_img = @song.artist 13 $title_img = @song.title 14 15 if @current_user 16 @user = User.find_by(id: @current_user.id) 17 end 18  #public/rmagickに引数を与えて実行 19 system("cd ~/lyrica/public/tweet_img && pwd && ruby rmagick.rb test2.png") 20 end

追記

### lib / rmagick.rb

ruby

1require 'fileutils' 2require 'RMagick' 3 4 5class Arg 6 # 引数取得 7 def get_arg 8 begin 9 if ARGV[0] 10 # ファイルが存在しなければ終了 11 unless File.exist?(ARGV[0]) 12 puts MSG_NOT_EXIST + " #{ARGV[0]}" 13 exit 14 end 15 else 16 # 引数無ければ終了 17 puts MSG_USAGE 18 exit 19 end 20 21 # ファイル名返却 22 return ARGV[0] 23 rescue => e 24 STDERR.puts "[ERROR][#{self.class.name}.get_arg] #{e}" 25 exit 1 26 end 27 end 28end 29 30class Rmagick 31 attr_reader :translation, :lyric, :title, :artist 32 33 def initialize(filename, translation_img:, lyric_img:, title_img:, artist_img:) 34 @filename = filename 35 @translation = translation_img 36 @lyric = lyric_img 37 @title = title_img 38 @artist = artist_img 39 end 40 41 # テキスト描画 42 def rmagick(columns = 5) 43 44 FileUtils.cp(@filename, "2"+@filename, {:preserve => true}) # 元画像退避 45 img = Magick::ImageList.new(@filename) # 画像オブジェクト 46 draw = Magick::Draw.new # 描画オブジェクト 47 begin 48 draw.annotate(img, 0, 0, 70, 320, @lyric.scan(/.{1,#{30}}/).join("\n")) do 49 50 self.fill = 'white' 51 self.stroke = 'transparent' 52 self.pointsize = 24 53 self.gravity = Magick::NorthWestGravity 54 end 55 56 draw.annotate(img, 0, 0, 70, 165, @tranalation.scan(/.{0,44}[a-z.!?,;](?:\b|$)/mi).join("\n") ) do 57 58 self.fill = 'white' 59 self.stroke = 'transparent' 60 self.pointsize = 44 61 self.gravity = Magick::NorthWestGravity 62 end 63 64 draw.annotate(img, 0, 0, 68, 55, @title) do 65 66 self.fill = 'white' 67 self.stroke = 'transparent' 68 self.pointsize = 24 69 self.gravity = Magick::NorthWestGravity 70 end 71 72 # 画像生成 73 img.write("2"+@filename) 74 rescue => e 75 STDERR.puts "[ERROR][#{self.class.name}.rmagick] #{e}" 76 exit 1 77 end 78 end 79end 80

### SongsController.rb

ruby

1def share 2 3 @translation= Translation.find_by(id: params[:id]) 4 @lyric = Lyric.find_by(number: @translation.number , song_id:@translation.song_id) 5 @song = Song.find_by(id: @translation.song_id) 6 7 if @current_user 8 @user = User.find_by(id: @current_user.id) 9 end 10 11 images = { 12 translation_img: @translation.content, 13 lyric_img: @lyric.content, 14 artist_img: @song.artist, 15 title_img: @song.title 16 } 17 filename = Rails.root.join('public', 'test2.png') 18 ::Rmagick.new(filename.to_s, **images).rmagick if filename.exist? 19 end

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

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

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

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

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

guest

回答1

0

ベストアンサー

public配下にrbファイルを置くのは斬新ですね・・基本的にpublic配下には静的ファイル置くのがいいんじゃないでしょうか、承知の上かもしれませんが。

うまくいかない原因はsystemで実行しているためrbagick.rbRailsと別プロセスになっているのが原因だと思います。

publicではなくて例えばlib配下にrmagick.rbを置いて以下のように修正してみてはどうでしょうか?

rb

1# lib/rmagick.rb 2class Rmagick 3 # str1などの変数はわかりにくいのでそのまま`translation`などがいいと思います。 4 attr_reader :translation, :lyric, :title, :artist 5 6 def initialize(filename, translation_img:, lyric_img:, title_img:, artist_img:) 7 @filename = filename 8 @translation = translation_img 9 @lyric = lyric_img 10 @title = title_img 11 @artist = artist_img 12 end 13 14 # ..省略 15end 16 17class SongsController < ApplicationController 18 def share 19 # ...略 20 images = { 21 translation_img: @translation.content, 22 lyric_img: @lyric.content, 23 artist_img: @song.artist, 24 title_img: @song.title 25 } 26 filename = Rails.root.join('public', 'test2.png') 27 ::Rmagick.new(filename.to_s, **images).rmagick if filename.exists? 28 end 29end

投稿2018/06/03 05:31

t_tonchim

総合スコア96

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

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

naoya.n

2018/06/03 06:05

NameError in SongsController#share uninitialized constant Rmagick になってしまいます、、!! どうすればいいかわかりますでしょうか、、m(__)m!! rmagick.rbはlib配下、test2.pngはpublic配下におきました。 編集後のコードは追記しました!!!
t_tonchim

2018/06/03 06:25 編集

あーすみません、lib配下がautoload_pathに追加されている前提で書いてしまっていました。 config/application.rbに以下の行を追記すれば動くと思います。 config.autoload_paths += %W(#{config.root}/lib)
naoya.n

2018/06/03 07:42

うまくいきました!!ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問