simpackerとRails.ajax
Rails界隈にいる人でsimpackerを採用されている方はいらっしゃると思います。
オールドスタイルな実装を行うにあたり少し躓いたところを残します。
simpackerじゃなくても躓いている内容です。
form_withでremote: true
にしたにも関わらず、respond_to部分でundefinedが起きた。
app/views/users/index.html.erb
<%= form_with url: users_search_path, method: :get, remote: true do |form| %> 〜 <% end %>
app/controllers/users_controller.rb
def search respond_to do |format| format.js end end
app/views/users/search.js.erb
$("#id").html("<%= j(render partial: 'table', locals: { users: @users }) %>");
すると、rails-ujsないことがわかった。 当然、simpacker使っているので自分で調整しないといけない。
Rails.ajaxはそもそもjQueryがないと動かないのでjQueryも一緒に追加した。
npmインストール
npm install --save jquery popper.js npm install --save @rails/ujs
app/javascript/application.js に追加
import 'jquery/dist/jquery.js' import 'popper.js/dist/popper.js' import Rails from '@Rails/ujs'; Rails.start();
webpacker.config.jsを修正する
const webpack = require('webpack'); 〜 plugins: [ new webpack.ProvidePlugin({ $: 'jquery/src/jquery', jQuery: 'jquery/src/jquery', Popper: ['popper.js', 'default'], Rails: ['@Rails/ujs'] }),
キャッシュを親子に持たせるのは危険。子が死んでも親は残り続ける。
Rails.cacheの中でRails.cacheをするのは危険。 親子関係と呼ぶが正しい表現なのか?
子が死んでも親は残り続ける。
そんな悲しい話ある? プログラミングの話でもあれば悲しい話だと思った今日この頃。
なので子と親に差分があって、 更新系のあるデータを扱う場合でもそうでない場合でもやるな。 絶対やるなという話。
コンソール上で適当にやった
def caching_test(id) Rails.cache.fetch("user-caching-#{id}", expires_in: 1.day) do lost_caching(id) end end def lost_caching(id) Rails.cache.fetch("user-child-caching-#{id}", expires_in: 60.seconds) do User.find(id) end end user = caching_test(1) => #<User id: 1, ...> Rails.cache.fetch("user-caching-1") => #<User id: 1, ...> Rails.cache.fetch("user-child-caching-1") => #<User id: 1, ...>
1分たった後に
Rails.cache.fetch("user-child-caching-1") => nil
消えた。よし!
Rails.cache.fetch("user-caching-1") => #<User id: 1, ...>
いた。悲しい。
ちなみに更新系は値が変わらないで生き続けるので要注意。
あんまりRails.cache周りのコマンドを知らない人は参考になるサイト。
僕もあれって一瞬なったので、参考にさせてもらったサイト載せさせていただきます。
sorceryのchange_password!の仕様が変わっているので注意
本番環境でパスワード変更ができなくなりました。辛い。
バージョン0.14の対応でsorceryのchange_password!の仕様が変わっておりました。
# Clears token and tries to update the new password for the user. def change_password(new_password, raise_on_failure: false) clear_reset_password_token send(:"#{sorcery_config.password_attribute_name}=", new_password) sorcery_adapter.save raise_on_failure: raise_on_failure end def change_password!(new_password) change_password(new_password, raise_on_failure: true) end
世の中のブログで紹介されているsorceryの実装方法が上記変更を取り込んだ実装になっていないため更新時に例外が発生してします。
if @user.change_password!(params[:user][:password]) redirect_to(root_path, :notice => 'Password was successfully updated.') else render :action => "edit" end
サービス提供されている方はコードを見直すことをおすすめします。 あるいは、私の修正方法を取り込むことで改善できます。
修正前:
@user.change_password!(params[:user][:password])
修正後:
@user.change_password(params[:user][:password])
これでバージョン0.14より前の挙動と同じにすることができます。 例外を発生させなくするだけですが。。。
反省。。。
specがこの辺を拾える様になっていれば問題を起こすことなくgemのバージョンアップができたのですがそうなっていなかったので本番に影響を出してしまいました。 自戒の意を込めて「ちゃんとテストを書きましょう」と言いたいです。
Docker + Rails6環境でコード即時反映されない件
Rails 6 + Dockerを用いて今サービス開発を行っている。
webpackerを使っていて、./bin/webpacker-dev-server
で起動していたらコードが即時ブラウザに反映すると思っていたが更新されない。
そういう人いるんじゃないかな?それまで毎回コンテナーを再起動してました。面倒になったので対応しました。
なんでそういう挙動をするかはわかっていないが対応方法はわかったので記載する。
ファイル: config/environments/development.rb
修正前:
# Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker
修正後:
# Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::FileUpdateChecker
ひとまずこれで少し開発が進めれる様になったとさ。
fudo3をバージョンアップ
ここ2週間くらいお仕事がバタバタしていてgemの開発が進まなかったけどカフェに行けたので今少し改善しました。
修正内容は、
- 坪単価の計算を追加
- 平米単価の計算を追加
これだけだけど不動産システムを作っていた時にこういうメソッドがいた気がするので追加しました。
他にv0.1.0で追加したメソッドのちょっとした修正をしました。
動作に影響ないところで。
fudo3は「不動産のサービス内でよく使われる計算をまとめたgem」にしたいので是非フィードバックください。
頑張って機能開発・改善していきたいと思います。
よろしくお願いします。
gemの名前をつける時は「-」はつけないほうがいい
fudo3を作ったときのメモになりますが、 当初、fudo3はfudo-3という名前でした。
ハイフンをつけたことでディレクトリが階層化されクラスが「Fudo::3」という気持ち悪いクラスになりました。
gemの開発コマンド
$ bundle gem fudo-3 -t
としたところ、
当然ファイルが自動生成されました。
ですが、ディレクトリが階層化されちゃいました。
ちょっと調べたところ「-」をつけることでディレクトが階層化になるそうです。
階層化したいケースはあまりないと思うので
ちょっとしたことですが「-」はつけない方がいいと思います。
gemビギナーなのでこれがきれいじゃないとは言い切れませんが。。。
ひとまず、「fudo3」が無事にリリースできたので記事を書いてみました。
RubyGems
ソースコード
- https://github.com/yposi/fudo3
現行バージョンは 0.1.0 (2020/08/25現在)
RubyMineの.idea/の対処法
RubyMineお使いですか?
プロジェクトで自分だけが使用しているケースってあると思うんですよね。
そういうときに.gitignoreに追加されておらずうっかり.idea/をstageして焦ったみたいな経験はございませんか?
私がやっているやり方を共有したいと思います。
自分の環境下の全プロジェクトで任意のファイルを 個人的に バージョン管理対象外にするやり方になります。
設定ファイルを作ります。
$ touch ~/.gitignore_global
.gitignore_globalを編集します。
# RubyMine .idea/ .idea/**/workspace.xml .idea/**/tasks.xml
設定を適応します。
$ git config --global core.excludesfile '~/.gitignore_global'
[core]部分に追加されます。
$ cat ~/.gitconfig [user] name = 名前 email = メールアドレス [core] excludesfile = ~/.gitignore_global
保存すると、以後.idea/のファイルは差分として出てこなくなります。
今更感もありますが、 ちょっとしたチップスでした。