-
éçºç°å¢ããã¹ãç°å¢ã®secret_key_base
- Rails5.2ããèªåçæãããããã«ãªã£ã
- Railsã¢ããªã±ã¼ã·ã§ã³åãMD5ãããã®ãå©ç¨ãã¦ãã
- Add credentials using a generic EncryptedConfiguration class (#30067) · rails/rails@69f976b
- ã¢ããªã±ã¼ã·ã§ã³åããçæããã¨å¤ãæ¨æ¸¬ã§ãã¦ãã¾ã£ã¦ã»ãã¥ãªãã£çã«ãããããªããã¨ãããã¨ã§Rails6.0ããã¯
SecureRandom.hex(64)
ã«å¤æ´ããã- å¤ã¯
tmp/development_secret.txt
ã«æ¸ãè¾¼ãããã«ãªã£ã - Fix possible dev mode RCE · rails/rails@4c74358
- å¤ã¯
- ãã¹ãç°å¢ã§ã使ãã®ã§
tmp/development_secret.txt
ã¨ããååã¯è¯ããªããã¨ãããã¨ã§tmp/local_secret.txt
ã«ãªãã¼ã ããã(Rails7.1.0.beta1) - Rails v7.2.0.beta1以éãRails.application.secretsåé¤ã³ãããã®å½±é¿ã§ãéçºç°å¢åã³ãã¹ãç°å¢ã®secret_key_baseã¯
tmp/local_secret.txt
ã®å¤ã決ãæã¡ã«ãªã£ã¦ãã- éå»ã«ã¯
ENV["SECRET_KEY_BASE"]
ãRails.application.credentials.secret_key_base
ã使ãã¦ãã - Use
secret_key_base
from ENV or credentials when present locally by p8 · Pull Request #53705 · rails/rails - Rails 8.0.2åã³7.2.3(2025/01/27æç¹ã§æªãªãªã¼ã¹)ã§ãã°ãã£ãã¯ã¹ãå
¥ãã
ENV["SECRET_KEY_BASE"]
ãRails.application.credentials.secret_key_base
ãã¾ã使ããããã«ãªã
- éå»ã«ã¯
- Rails5.2ããèªåçæãããããã«ãªã£ã
-
Rails7.1ããã
rails assets:precompile
ç¨ã®ããã¼secret_key_baseã®è¨å®ãã§ããããã«ãªã£ã- ãããã¤ç°å¢ã§assetsã®ãã«ãã¾ã§è¡ãçãå¿
ããã
rails assets:precompile
ãããç°å¢ã«RAILS_MASTER_KEY
(ã¤ã¾ãsecret_key_base)ãè¨å®ããã¦ããã¨ã¯éããªãã®ã§ãã¯ã¼ã¯ã¢ã©ã¦ã³ãã¨ãã¦ENV["SECRET_KEY_BASE_DUMMY"]
ãããã°SecureRandom.hex(64)
ãsecret_key_base
ã¨ãã¦ä½¿ãããã«ãªã£ã - Allow assets:precompile to be run in a production build step without ⦠· rails/rails@a3e392f
- ãããã¤ç°å¢ã§assetsã®ãã«ãã¾ã§è¡ãçãå¿
ããã
-
æ¬çªã®secret_key_base
Active Storageã§ã¢ãããã¼ããããã¡ã¤ã«ã®URLãå³è¿ãã¨ãã«æ°ãã¤ãããã¨
(注è¨)ããã¯ã ãã¶éãªã¾ã¨ãã§ããééããã£ããæãã¦ä¸ããï¼
- ActiveStorageã§DiskServiceãå©ç¨ãã¦ããå ´åãURLã®ãã¡ã¤ã³é¨åã¯ãªã¯ã¨ã¹ãããããæãã«çæããã
- ActiveStorage::SetCurrentã¨ããã¢ã¸ã¥ã¼ã«ãã³ã³ããã¼ã©ã«includeããã¨before_actionã§ãªã¯ã¨ã¹ãã®æ å ±ãCurrentAttributeã«ã¢ãµã¤ã³ãã
- éçºç°å¢ã ã¨
ActiveStorage::SetCurrent
ãincludeããã°åé¡ãªããã ãã©ãã¹ãç°å¢ã§åé¡ã«ãªããã¨ããã ActiveStorage::Current.host
not set causing disk service to throwURI::InvalidURIError
· Issue #40855 · rails/rails- ãã¹ãç°å¢(ä¾: ã³ã³ããã¼ã©ã¹ããã¯)ã§ã¢ãããã¼ããããã¡ã¤ã«ã®URLãå³è¿ããããªã±ã¼ã¹
- ãã¹ãæã«
user.save
âuserã®ç»åãã¢ãããã¼ããããâãµã ãã¤ã«ãä½ãã¿ã¤ãã³ã°ã§ActiveStorage::DiskControllerã®showã¢ã¯ã·ã§ã³ãå®è¡ãããâExecutorãå®è¡ãããâCurrentAttributesã®å¤ã®ã¯ãªã¢ãå®è¡ãããâActiveStorage::SetCurrentã§è¨å®ããã¯ãã®å¤ãã¯ãªã¢ããã¦ãã¾ãâãã¡ã¤ã«ã®urlãåç §ãããã¨ãã¦ã¨ã©ã¼ã«ãªããã¨ããæµãã«ãªãã¯ã - ããã¯ãã¹ãã1ã¹ã¬ããã§å®è¡ããã¦ããã®ãåå ãªã®ã§ãè¤æ°ã¹ã¬ãããªç°å¢ã§ã¯èµ·ããªãã¯ã
- ãã¹ãæã«
- 解決çã¨ãã¦ã¯ãrails_helper.rbãªã©ã«âãæ¸ã
Rails.application.executor.to_complete do ActiveStorage::Current.url_options = { host: 'http://example.com' } end
- ãããã¯éçºç°å¢åã³ãã¹ãç°å¢ã§ãS3Serviceãªã©ã使ãããã«ãã¦ãDiskServiceã使ãã®ããããã¨è¯ã
- å°æ¥ç(Rails8.1?)ã«ã¯åºå®ã®ããã©ã«ãå¤ã®ãããªãã®ãè¨å®ã§ããããã«ãªã£ã¦ãã®æã®ããã¯ã¯ä¸è¦ã«ãªããããããªã
rubymineã§Find Actionãããã®ã«ã§ããªãã®ã解決ããæ¹æ³
- rubymineã®ãã¼ãã¤ã³ãã«cmd+shift+aãfind action(ã¢ã¯ã·ã§ã³ã«çµãè¾¼ãã æ¤ç´¢)ã¨ãã¦ç¨æããã¦ãã
- ããmacä¸ã§å®éã«ãããæã¤ã¨ãªãã次ã®ããã«ãªã
- ããã¯âã«ãããã¿ã¼ããã«ã®manãã¼ã¸ã¤ã³ããã¯ã¹ã§æ¤ç´¢ãã®ãã¼ãã¤ã³ãã¨ç«¶åãã¦ãããã
- âã®ããã«ãã§ãã¯ãæ¶ãã¨è¯ã
docker-compose ã³ãã³ãã¨docker composeã³ãã³ãã¯å¥ç©
- M1 macã§
docker-compose up
ããã¨ãªããexec /usr/local/bin/docker-entrypoint.sh: exec format error
- docker imageã¯intelç¨ãªã®ã§ãããé¢é£ãã¦ãã
- ã¨æã£ã¦è²ã 試ããããªã«ãå¤ããã
- docker desktopã®ãã¼ã¸ã§ã³ã4.31.0 -> 4.32.0ã«ä¸ããã
docker-compose up
ã失æããããã«ãªã"docker-compose"ã³ãã³ãã使ã£ã¦ããã®ãè¯ããªããããï¼ã¨ããäºå®ã«æ°ã¥ãã docker compose up
ã¨ããããã¾ãããã¾ãã- ã³ãã³ãå±¥æ´ã§
docker-compose up
ãå®è¡ãã¦ããã®ãè¯ããªãã£ãã¨ãã話
E2Eãã¹ãã§ããªãã¼ã·ã§ã³ã調æ´ãã¦ã¿ã¤ã ã¢ã¦ããæå¶ãã
- é¢é£: system specã§Net::ReadTimeoutã«ãªã£ãã - ããããwebãµã¼ãã¹éçºæ¥è¨ãã©ã·ã®è£
- ãã£ã±ãã¿ã¤ã ã¢ã¦ãã®æéã伸ã°ãã®ã§ã¯ãªãããã¹ãå´ã§ããªãã¼ã·ã§ã³ã®æ¡ä»¶ãç·©åãã¦ãããã»ãããã¼ã¿ã«ã®ãã¹ãå®è¡æéãçããªã£ã¦ããããããªãããã¨æã£ã¦æ¬¡ã®ããã«ãã
- (è¨å®ã¯palkan/anyway_config: Configuration library for Ruby gems and applicationsã使ã£ã¦ãã¾ã)
class DailyReport < ApplicationRecord validates :body, presence: true, length: { maximum: -> { ValidationConfig.daily_report[:body][:maximum] } } end
around do |example| original = ValidationConfig.daily_report[:body][:maximum] ValidationConfig.daily_report[:body][:maximum] = 10 example.run ValidationConfig.daily_report[:body][:maximum] = original end
- rails5.2ãããmaximumã«lambdaã渡ãã¦åçã«æ¡ä»¶ãå¤ããããããã«ãªã£ã¦ãã
- ã¾ããrails7.1ããã¯å¼æ°ãªãã®lambdaã§ãåãä»ããããããã«ãªã£ã¦ãã
flashã¡ãã»ã¼ã¸ãæã 表示ãããªãflakyãã¹ããæ¹åãã話
Railsã§
- cookie sessionã使ã£ã¦ãã
- éåæã§APIãããå©ãã¦ãã
ã¨ããæ¡ä»¶ä¸ã§ãä¾ãã°æ¥å ±ãæ稿ãããã¨ã«"æ稿ãã¾ããï¼"ã¨ããflashã¡ãã»ã¼ã¸ã表示ãã¦ããã¯ããªã®ã«ãªãã"æ稿ãã¾ããï¼"ã表示ãããªãã¨ããç¾è±¡ãæã èµ·ãã£ã¦ãã¾ããã
ããã¯æ¬¡ã®ãããªãã¨ãåå ã ã¨æ¨æ¸¬ãã¦ãã¾ãã
- éåæAPI(ä¾: æ¥å ±ã®ãã¬ãã¥ã¼ã表示ãã)ãå®è¡ããã
- æ¥å ±æ稿ãã¿ã³ãæ¼ã
- æ稿ãæåãã¦æ¥å ±è©³ç´°ãã¼ã¸ã¸ã®ãªãã¤ã¬ã¯ãç¨ã®ã¬ã¹ãã³ã¹ãè¿ããã
- SetCookiesã§flashã¡ãã»ã¼ã¸ãå«ãã cookie sessionãè¿ããã
- éåæAPIã®ã¬ã¹ãã³ã¹ãè¿ã
- SetCookiesã§flashã¡ãã»ã¼ã¸ãå«ã¾ãªãcookie sessionãè¿ããã
- æ¥å ±è©³ç´°ãã¼ã¸ã¸ã®ãªã¯ã¨ã¹ããå®è¡ããã
- ãã®ã¨ãéä¿¡ããCookieã«ã¯flashã¡ãã»ã¼ã¸ãå«ã¾ãã¦ããªãã®ã§"æ稿ãã¾ããï¼"ã¯è¡¨ç¤ºãããªã
é·ãããã®åé¡ã«æ©ã¾ããã¦ããã®ã§ãããAPIå®è¡æã¯æ¬¡ã®ããã«ãã¦SetCookiesããããè¿ããªãããã«ããã¨ããæ¹æ³ãæãã¤ããã®ã§è©¦ãã¦ã¿ã¾ãããããããããã§è§£æ±ºããã¯ãã
class Api::BaseController < ApplicationController class NullCookieJar < ActionDispatch::Cookies::CookieJar def write(*) # nothing end end before_action :null_cookies def null_cookies request.cookie_jar = NullCookieJar.build(request, {}) end end
Rails8.0.0ãã¤ã«ã¹ãã¼ã³ã®ç¾ç¶
ããã¯ãªã«
- 8.0.0 Milestoneãè¦ã¦æ°ã«ãªã£ããã®ãã¾ã¨ãã¦ãã¾ã
- ãã¤ã«ã¹ãã¼ã³ã¯å
é±ãããã«ã§ããã®ã§ãããããã¼ã¸ããã¦ãããã¤ãããããããã¾ã
- DHHãå¹´æ«å¹´å§ã«ãã£ã¡ãåãã¦ãã
æ°ã«ãªã£ããã®ãã¡
- Ruby3.3以ä¸ã®ãµãã¼ã
- DHHã¯æå3.3以ä¸ã§ãã¨ããæ°æã¡ã ã£ããã ãã©æµç³ã«ã¿ããªå¤§å¤ãããã¨ããæè¦ãåºã¦çµå±ãªãªã¼ã¹æ(2024å¹´ã®äºå®)ã«ãµãã¼ãããã¦ããRubyã®ãã¼ã¸ã§ã³ãã¤ã¾ã3.1以ä¸ã«è½ã¡çãã
- PR: Bump the required Ruby version to 3.1.0 by byroot · Pull Request #50491 · rails/rails
- âã®PRã§ã¯ãã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ã¢ããæã«Rubyã®ãµãã¼ããè½ã¨ããã ã¨Railsèªä½ã®ã¡ã³ãã大å¤ã ãã¢ããªã±ã¼ã·ã§ã³éçºè ã大å¤ãªã®ã§ãæ¯åãã¤ãã¼ãã¼ã¸ã§ã³ã¢ããã§ããã®æãµãã¼ããã¦ããRubyã®ãã¼ã¸ã§ã³ã ããµãã¼ãããããã«ãããããã¨ããæè¦ãåºã¦ãã
- ã¤ãã§ã«ã»ãã¥ãªãã£ãã£ãã¯ã¹ãã¼ã¸ã§ã³ãè½ã¨ããããã¨ããæè¦ããã
- ãã®ã¸ãæçµçã«ã©ããªããããããªããã©ãRailsã®ãã¼ã¸ã§ã³ãä¸ããä¼ç¤¾ã¯Rubyã®ãã¼ã¸ã§ã³ãä¸ããã®ã§ãããªã«å½±é¿ã¯ãªãæ°ããã¾ãã
- solid_queue, solid_cache, prop_shaft, kamalãããã©ã«ãã«
- Action Cableã®ã¢ããã¿ã®ããã©ã«ããDBã«ãã
- solid_queue, solid_cacheã¨ä¸ç·ã§redisãªããããã©ã«ãã«ããæ¹éã£ã½ã
- ãã¨ãã¨postgresqlã¯ã¢ããã¿ã¨ãã¦ä½¿ããããã©ãMySQLãsqlite3ã§ã使ããããã«ãã¦ãããããã©ã«ãã«ãããã¨ããæ¹é
- ONCEã§ã¯ãã§ã«ããã§ãã£ã¦ãã模æ§
- å¤ããã©ã¦ã¶ã§ã¢ã¯ã»ã¹ããã¨ãã«å¤ãããã¨åºãæ©è½
- Add allow_browser to set minimum versions for your application by dhh · Pull Request #50505 · rails/rails
- ãã¼ã¸æ¸ã¿
- ã¦ã¼ã¶ã¨ã¼ã¸ã§ã³ãã®å¤å¥ç¨ã«gshutler/useragent: HTTP User Agent parser ãä¾åã«è¿½å ããã¦ãã
- allow_browserã¡ã½ããã追å
- versionsãªãã·ã§ã³ã§å¯¾è±¡ãã¼ã¸ã§ã³ã追å
- 対象ã
:modern
ã§æå®ããã¨Safari 17.2+, Chrome 119+, Firefox 121+, Opera 104+æ±ãã«ãªã - å¤ããã©ã¦ã¶ã§ã¢ã¯ã»ã¹ããã¨ãã«ããã©ã«ãã 㨠public/426.html ã表示ããã
block: -> { redirect_to blocked_path }
ã¿ãããªãªãã·ã§ã³ã§ä¸æ¸ãã§ãã
class ApplicationController < ActionController::Base # Allow only browsers natively supporting webp images, web push, badges, import maps, CSS nesting + :has allow_browser versions: :modern end class ApplicationController < ActionController::Base # All versions of Chrome and Opera will be allowed, but no versions of "internet explorer" (ie). Safari needs to be 16.4+ and Firefox 121+. allow_browser versions: { safari: 16.4, firefox: 121, ie: false } end class MessagesController < ApplicationController # In addition to the browsers blocked by ApplicationController, also block Opera below 104 and Chrome below 119 for the show action. allow_browser versions: { opera: 104, chrome: 119 }, only: :show end
- èªè¨¼æ©è½ã®è¿½å
- ä»ã®ã¨ãã lazaronixon/authentication-zero: An authentication system generator for Rails applications. ã®ãããªã³ã¼ãã¸ã§ãã¬ã¼ã¿ãæ³å®ãã¦ãã模æ§
- logrageçãªæ§é åãããã°åºåãããæ©è½
Action Notifier(ããã·ã¥éç¥ç¨ã³ã³ãã¼ãã³ãã®è¿½å )
- Railsã§ããã·ã¥éç¥ãç°¡åã«å®è£ ã§ããããã«ãªã
- âã®æºåã¨ãã¦PWAç¨ã®ãããã§ã¹ããããã©ã«ãã§çæããããã«ãªã£ã (ãã¡ãã¯ãã¼ã¸æ¸ã¿)
- Rubocopã®è¿½å
- rails/rubocop-rails-omakase: Omakase Ruby styling for Railsãèªåã§Gemfileã«å ¥ã
- LayoutãStyleãªã©ã®ãã¿ããªããã»ã©æå¥ããªããããªCopã ããããã©ã«ãæå¹ã§ã»ãã¯ç¡å¹ã«ãªã£ã¦ãã
- standardrb/standard: Ruby's bikeshed-proof linter and formatter ð² ã¯ã©ãï¼ã¨ããè°è«ããã£ããDHHã¯æ¡ç¨ããªãã£ã
- ãã¼ã¸æ¸ã¿
- brakemanã®è¿½å
- brakemanãèªåã§Gemfileã«å ¥ã
- ãã¼ã¸æ¸ã¿
- GitHub Actionç¨ã®ãã¡ã¤ã«ã®çæ
- rubocop, brakeman,
rails test test:system
ãå®è¡ããGitHub Actionsã®workflowã追å ããã - ãã¼ã¸æ¸ã¿
- rubocop, brakeman,
- ã¢ã¯ã»ã¹å¶éæ©è½ã®è¿½å
- rails/kredis: Higher-level data structures built on Redisãå©ç¨ãã¦ãã
- ãã¼ã¸æ¸ã¿
- krediså´ã®PR
- kredis1.7.0以ä¸ã§å©ç¨ã§ãã
- redisãå©ç¨ããç°¡åãªã«ã¦ã³ã¿ã«ããã¢ã¯ã»ã¹å¶éæ©è½ãã¨ããå°è±¡
- æåã«ã«ã¦ã³ããã¦ããæéãè¨æ¸¬ãã¦ãwithinã®æéãéããããªã»ãããããã«ã¦ã³ã¿
class SessionsController < ApplicationController rate_limit to: 10, within: 3.minutes, only: :create end class SignupsController < ApplicationController rate_limit to: 1000, within: 10.seconds, by: -> { request.domain }, with: -> { redirect_to busy_controller_url, alert: "Too many signups!" }, only: :new end