Category Archives: Code

Rails: Upgrade Cells 3 to Cells 4


In Rails, I upgraded Cells gem from 3.11.3 to 4.0.2. And I upgraded Rails from 4.1.9 to 4.2.4 together. Here, I wrote what I did about Cells upgrade.

Basic instruction is in From Cells 3 to Cells 4 Upgrading Guide. It’s not easy to upgrade it.

Environment

  • Ruby 2.2.3
  • Template Engine: Slim

Story

ある人が外注に出していたプログラムを なぜか私がデザイン、マークアップ含めて更新することになり、 Rails と Gem のバージョンを更新した。

その Rails のアプリケーションにテストコードは一切なかった。

リリース前のプログラムに対して変更を行いました。

What I did

  1. Create ApplicationCell
  2. Change helper to include
  3. Change render_cell to cell
  4. Change file name
  5. Change partial view rendering way

Create ApplicationCell

If you use functions relates to device or form tags, the application will stop working after upgrading to Cells 4. Then I created ApplicationCell as a parent class of all Cell class.

アプリケーションを見ながら 次のような ApplicationCell を作りました。 include で取り込んでいるモジュールは、 エラーが出る度に順次取り込んでいったものです。

self.helper_method is called by devise, so it is necessary. Cells では 既に意味のないメソッドになっているので、 何も処理は行いません。

Change helper to include

In each cell class, there was a line “helper ApplicationHelper“.

Webrick を実行してページを開くと undefined method と表示されました。 Then, change helper statement to include statement with sed command.

Change render_cell to cell

Cells 4 から メソッドが変わりました。 ビューの中で使用されている render_cellcell に書き換えました。

いままで書いていた人がコードを綺麗に保っていたので、 sedコマンドを使って簡単に変更できました。 書き方が何通りもある場合は、簡単にはいきません。

Before

After

Change file name

There were cell templates named like method_name.html.slim, but Cells 4 method cell(:cell_name).(:method_name) search template named method_name.slim. It caused exception.

In cells/lib/cell/view_model.rb of Cells 4, find_template method generates template name. Generated template name by that method doesn’t contain the string 'html'.

I removed “html” from template file name.

Change partial view rendering way

I know what I did is quick and dirty way.

In old code, cell template renders partial view app/views/shared/something.html.slim.

Before

But it doesn’t work in Cells 4.

cells/lib/cell/templates.rbcells/lib/cell/view_model.rb を見ながら次のようにコードを変更しました。

After

I had not only to create prefixes and view value, but change view value.

app/views内のテンプレートを呼び出す際のメソッドを ApplicationCell に作ったほうがよかったかもしれません。

Cell の中に self.view_paths += ['app/views'] を加えると、 app/views/cell_name の中でテンプレートを探すようになります。 つまり、次のように変更しても動くようになります。

Alternative


The way to connect Bitbucket to Slack


I wrote the code to push notification to Slack when someone create an issue, when someone created a comment, etc. in Bitbucket.

Story

The mechanism to send notification to Slack when some action is taken in Bitbucket, is prepared in Bitbucket, called webhooks. It can be turned on in each project setting page.

In Slack, we can connect to Bitbucket easily in setting page. But Slack can only receive push notification of Bitbucket, can’t receive comment or issue notification, at that time ().

I want to be notified issue and comment creation rather than push action, and created such code in Google Apps Script.

Code

Copy the following script to Google Apps Script, and deploy as web app, which is in “publish” menu. Then, it’s url would be shown and set it as webhook url in Bitbucket console panel.

Bitbucket で何らかの操作が行われるたびに Google Apps Script の処理が実行され、 Slack に 投稿されるようになります。

If I had had time, I would’ve create object model and factory, etc. But in real, the code is not so clean.

(And I put the code to Github Bitbucket To Slack Gas. Contribution is welcomed.)

First, Bitbucket send post request to the app and doPost will be executed. Then, it creates message to post to Slack in createSlackMessage function, from the data posted.

After that, it posts to Slack.

Caution

createSlackMessage では、 Issue の場合、 Pull Request の場合などパターン分けしていますが、 上で分けてある以上に 細かくパターンが分かれます。 今回は私の業務上必要だろうと思われる分岐にとどめています。 そのパターンを正確に判断するには Bitbucket から送信されるヘッダの中を確認するのがいいのですが、 Google Apps Script ではリクエストヘッダを確認することができないため ペイロード部分のデータで分岐を行っています。

実際のところ Pull Requestapproved のあたりはまだ検証中のため、 正しく判別できているという保証がないです。

If you can use Heroku or AWS or other hosting service, it would be good to create in PHP, Ruby, etc. which can handle request header.


RSpec: Test Helper Method using current_user function


I’ll introduce the way to test rails helper code that uses current_user method provided by device gem.

Environment

  • Ruby 2.2.2
  • Rails 4.1.8
  • RSpec 3.1.0

Test Target

The function we are going to test is below. It compare the return value of current_user method and user_id given as argument, and check the argument user_id is of current login user or not.

Continue reading RSpec: Test Helper Method using current_user function