ایجاد middleware در rails

سلام خسته نباشید دوستان.
قصد ایجاد middleware داخل rails رو داشتم سرچ که کردم که فهمیدم به طور پیش فرض چنین قابلیتی وجود نداره داخل rails و باید middleware برای rack ایجاد که به نظر درست میاد .
منم یک پوشه داخل app درست کردم به اسم middleware و فایل خودم رو اونجا گذاشتم که محتویات فایلم به این شکله :
‍‍‍
class AuthMiddleware
def initialize(app)
@app = app
def call(env)
@req = Rack::Request.new(env)
status, headers, body = @app.call(env)
end
end

و بعد هم داخل /env/development این کلاس رو معرفی می کنم
حالا دو تا سوال ‍ ‍۱ - شما هم مشابه چنین کاری رو انجام می دید و شیوه من درسته ؟
۲ - مشکلی که دارم این هستش که محض کوچکترین تغییر در داخل این فایل خطای A copy of AuthMiddleware has been removed from the module tree but is still active! برمی گردونه و من مجبور وب سرویس رو ریست کنم تا درست بشه … فکر کنم یک طور کش می کنه کد ها رو … چطوری باید رفع کنم این مشکل رو ؟

  • خیلی سعی کردم نشد کد ها رو فرمت کنم کرش می کرد سایت … جلوتر پوزش می خوام

Middleware فقط در زمان اجرا لود میشه و لازمه که سرور ریست بشه

1 پسندیده

توماج جان پس راهی که رفتم برای ساخت middleware درست هست …آره ؟

بنظر درست میاد، فقط در config باید بگی که ازش استفاده بشه و دلیل اینکه نیاز به ریست داری هم همینه، حدس میزنم از روش زیر استفاده کردی

Rails.application.config.middleware.use AuthMiddleware
1 پسندیده

بله از همین روش استفاده کردم …

1 پسندیده

@toomaj جان هنوز این قضیه restart اوکی نشده راهی نیست من اینو رو طوری تنظیم کنم که نیاز نباشه با هر تغییر ریست کنم سرور رو ؟
سعی کردم مسیر پوشه middleware رو به eager اضافه کنم ولی جواب نداد

config.eager_load_paths << Rails.root.join('app/middlewares/')

راه حل شما چیه ؟

سلام، باید کد رو ببینم، اما کلا چرا به همچین چیزی نیاز داری؟ فقط برای development هست؟ اگر اینطوره توی فایل config/environments/development.rb گانفیگ زیرو انجام بده

config.cache_classes = false

هرچند فکر کنم در dev به صورت پیشفرض همیطور باشه.
و کلا یه نگاهی به لینک زیر بندازی هم بد نیست
https://guides.rubyonrails.org/configuring.html

برای چی نیاز دارم که مشخصه یک middleware ساختم که قبل از اجرای route بیاد auth رو چک کنه به علاوه یک سری چیزهای دیگه و مثلا اگر کاربر لاگین نبود ریدایرکتش کنه به /auth و… و خب باید این قبل از هر request اجرا بشه
در مورد کانفیگ هم به طور پیش فرض کلا false هست مقدار cache_classes و این خطا رو بر می گردونه

راستش اصلا متوجه نشدم چی شد

من بد توضیح دادم :slight_smile:
خب برای auth داخل کنترلر من میام email , password کاربر برو بررسی می کنی و بعد id رو داخل session می زارم
زمانی که کاربر می خواد وارد یک route بشه من میام قبل از اجرای action داخل middleware بر اساس اون id که داخل session گذاشتم اول می فهمم که کاربر لاگین کرده یا نه و بعد اطلاعات یوزر رو می زارم داخل request تا توی کنترلر به راحتی بتونم ازش استفاده کنم
تا این جا اوکیه … ولی حالا مشکلم این هستش به خاطر middleware که درست کردم با خطای اول پست روبرو می شم و مجبورم با هر تغییر سرور رو ریست کنم
متوجه منظورم شدید ؟

با هر تغییر در کد سرور در prod باید ریستارت بشه؟ اگر اینطوره خب کار درستیه و باید به همین شکل باشه

برای prod که صد در صد درسته ولی این مشکل الان زمان develop پیش میاد و روی مخه :slight_smile:
rails server -e development

:joy::joy::joy:
الان گرفتم چی شد،‌ میتونی دقیقا بگی که چطور پیاده شده؟

1 پسندیده