使用環境
ruby 2.6.5
Rails 6.0.3.4
macOS Catalina 10.15.6
エラー内容
'ArgumentError (Missing host to link to!
Please provide the :host parameter, set default_url_options[:host],
or set :only_path to true):'
ええと、見たこともないエラーにぶち当たりました。はてはて・・・
やっていたこと
そもそも何をしていてこうなったのかを簡単に説明しておきます。
Ajaxでタイムラインの記事にコメント投稿機能を実装時に、コメント投稿したユーザーのアバター画像を表示させる機能も同時につくっていて、user_serializerをあれこれと調べながらいじっていました。
(以下コード)
class UserSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers
attributes :profile, :avatar_image, :account_name, :comment_avatar_image
has_many :comments
has_one :profile
def comment_avatar_image
rails_blob_path(object.avatar_image) if object.avatar_image.attached?
end
end
このようにcomment_avatar_image
を定義して、JavaScript側は動的にユーザーのコメントと画像(とsユーザー名)を表示するために、appendを使ってこのようにコードを書きました。
const appendNewComment = (comment) => {
$('.comments-container').append(
`<div><img class="comments_image"src="${comment.user.comment_avatar_image}"></img></div>
<div class="comments_name"><p>${(comment.user.account_name)}</p></div>
<div class="comments_content"><p>${(comment.content)}</p></div>`
)
}
しかし上記のエラーが出たので、エラー文を読んでみることに。
「'ArgumentError (リンク先のホストがありません
hostパラメータを指定して、default_url_options[:host]を設定してください。
または :only_path を true に設定してください)'」
とありました。これ通りにやってみます。
解決策
そもそもこのdefault_url_options[:host]
はどこかで見たことあるなと思っていたら、deviseの設定をconfigのdevelopment.rbでした時でした。
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
私と同じくdeviseを使用してこれを設定した人なら
先ほどの指示の「hostパラメータを指定して、default_url_options[:host]を設定してください。」
これでいうhostはlocalhostになっています。
ではどうすればいいのか?
記事や公式文書を調べていると、以下のような記述をすればいいことがわかりました。
host = 'localhost' #←先ほどの上のコードのhost名と合わせる
Rails.application.routes.default_url_options[:host] = host
これで、一旦サーバーを落としてもう一度起動してリロードしましょう!(意外に忘れがち)
※environment系は一回サーバーを落として立ち上げないと変更が反映されません。
疑問
解決はしましたが、似たような記事を見てもAction Mailerの設定がメインでした。上記のように画像を反映させることに関して、なぜこのような設定が必要なのかはまだ疑問が残るので検索中です。
もし、わかる方がいたらご教授いただけると幸いです。
参考記事
action-mailerのビューでurlを生成する
RailsでMissing host to link to!が出たときに。model内でURL組み立てる場合の設定