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

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

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

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

Ruby on Rails 6

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

Q&A

1回答

354閲覧

コールバックを制限したい

higmonta

総合スコア29

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/05/11 13:00

編集2022/05/18 16:43

Rails初心者になります。
開発環境は、以下の通りとなります。
Rails: 6.0.4.1
Ruby: 2.5.1

初歩的な質問で申し訳ございませんが、Railsガイドや記事などが見つからなかった為、こちらで質問させていただきます。
コールバックを特定のアクションのみの時に発動するように設定ができますでしょうか?
以下のようなコードとなっております。

[app/models/cooking_memory.rb] class CookingMemory < ApplicationRecord after_initialize :default_image belongs_to :user has_one_attached :cooking_memory_image validates :cooking_name, presence: true validates :fish_name, presence: true def default_image if !self.cooking_memory_image.attached? self.cooking_memory_image.attach(io: File.open(Rails.root.join('app', 'assets', 'images', 'cooking_memory', 'default.jpg').to_s), filename: 'default.jpg', content_type: 'image/png/jpg') end end end
[app/controllers/cooking_memories_controller.rb] class CookingMemoriesController < ApplicationController before_action :require_login def new @cooking_memory = CookingMemory.new end def create @cooking_memory = current_user.cooking_memories.new(cooking_memory_params) if @cooking_memory.save flash[:success] = '登録に成功しました' redirect_to cooking_memories_path else flash.now[:danger] = '登録に失敗しました' render :new end end private def cooking_memory_params params.require(:cooking_memory).permit(:cooking_name, :fish_name, :cooking_date, :cooking_memory_image, :memo) end end

newアクションのnewメソッドの時は、コールバックのafter_initialize :default_imageを発動せずに、createアクションのnewメソッドの時のみ、after_initialize :default_imageによりnewメソッドの直後にdefault_imageを実行したい状態です。

コントローラに記載するbefore_actionでonlyを指定するような方法でafter_initialize :default_imageも発動するアクションを限定するようなやり方があるかを質問させていただきます。

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

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

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

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

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

higmonta

2022/05/18 16:49

回答ありがとうございました! すみません、文章に誤字があったので、訂正しました。 色々試したのですが、下記のように記述してもうまくいきませんでした。 ``` [app/models/cooking_memory.rb] class CookingMemory < ApplicationRecord after_initialize :default_image, only: :create belongs_to :user has_one_attached :cooking_memory_image validates :cooking_name, presence: true validates :fish_name, presence: true def default_image if !self.cooking_memory_image.attached? self.cooking_memory_image.attach(io: File.open(Rails.root.join('app', 'assets', 'images', 'cooking_memory', 'default.jpg').to_s), filename: 'default.jpg', content_type: 'image/png/jpg') end end end ``` [![Image from Gyazo](https://i.gyazo.com/f2f9351819ea865bdf544a3c0816c5ee.png)](https://gyazo.com/f2f9351819ea865bdf544a3c0816c5ee) `default_image`のメソッドをcreateアクションのnewメソッドの後にのみ実行したい状況なのですが、コールバックを利用して指定したアクションの時のみ実行する方法がなかなか思いつきません。。
guest

回答1

0

「before_action :require_loginを発動せずに」と「after_initialize :default_image を実行したい」との関係がよくわからんのですが、
after_initialize も on: :create が効くと思いますよ

投稿2022/05/12 23:14

winterboum

総合スコア23324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問