rails g で使われるテンプレートをSlimで作成する際の <%% 部分の記載方法

こんにちは。
この記事では表題の通りrails gの時に使用されるテンプレートを、
Slimでかいた時に<%%部分の記載方法でつまり、またWEBで適切な記事が見つけられなかったので、備忘録として残しておく。

基本のどのようにしてrails g時に使われるテンプレートをSlimで作成するかについては、
以下の記事を参照してください。
RailsのScaffoldのテンプレートをカスタマイズする – Qiita

結論から申し上げると”そのまま”書けばよかったということなのだが、
<%% をそのまま書くわけではない。以下、解説します。

Rails5 標準のrails g用のテンプレートの中にERBで以下のように記載されている部分がある。



<table>
  
<thead>

<tr>
<% attributes.reject(&:password_digest?).each do |attribute| -%>
      
<th><%= attribute.human_name %></th>

<% end -%>
      
<th colspan="3"></th>

    </tr>

  </thead>


<tbody>
    <%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
      
<tr>
<% attributes.reject(&:password_digest?).each do |attribute| -%>
        
<td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>

<% end -%>
        
<td><%%= link_to 'Show', <%= singular_table_name %> %></td>


<td><%%= link_to 'Edit', edit_<%= singular_table_name %>_path(<%= singular_table_name %>) %></td>


<td><%%= link_to 'Destroy', <%= singular_table_name %>, method: :delete, data: { confirm: 'Are you sure?' } %></td>

      </tr>

    <%% end %>
  </tbody>

</table>



<%% だらけである。
また <%% %><%= %> がネストされていたりする。
私が使った ERBtoSlim のコンバーターでは文字列に変換されてしまう。


table
  thead
    tr
      - attributes.reject(&:password_digest?).each do |attribute|
        th= attribute.human_name
      th colspan="3" 
  tbody
    | \% @%= plural_table_name %&gt;.each do |#{singular_table_name}| %&gt;
    tr
      - attributes.reject(:password_digest?).each do |attribute|
        td
          | \%= %= singular_table_name %&gt;.#{attribute.name} %&gt;
      td %= link_to 'Show', %= singular_table_name %&gt; %&gt;
      td
        | \%= link_to 'Edit', edit_%= singular_table_name %&gt;_path(#{singular_table_name}) %&gt;
      td %= link_to 'Destroy', %= singular_table_name %&gt;, method: :delete, data:   confirm: 'Are you sure?'   %&gt;
    | \% end %&gt;

早速解決方法を。
単純に <%%- <%%== とし、
ネストされている <% %><%= %> はそのまま記載すると、 rails g で正常にテンプレートを生成してくれる。


table
  thead
    tr
      - attributes.reject(&:password_digest?).each do |attribute|
        th= attribute.human_name
        th colspan="3" 
  tbody
    - @<%= plural_table_name %>.each do |#{singular_table_name}| %>
      tr
        - attributes.reject(:password_digest?).each do |attribute|
          td
            = <%= singular_table_name %>.#{attribute.name} %>
        td <%= link_to 'Show', <%= singular_table_name %> %>
        td
          = link_to 'Edit', edit_<%= singular_table_name %>_path(#{singular_table_name}) %>
        td <%= link_to 'Destroy', <%= singular_table_name %>, method: :delete, data:   confirm: 'Are you sure?'   %>

エディター上では、シンタックスエラーとして扱われて、
エラーのハイライトが出たりすると思われるが、これで正常に動作する。
RubyMineを使っているが、警告が出ている。

以上

Electron と Ruby でネイティブアプリを作る方法 – 1 標準出力随時受け取り

概要

こんにちは。アレクスです。
今回はですね。 Node.jsからrbファイルを実行して、
標準出力を受け取ることについて解説します。

長いこと中途半端に取り組み見て見ぬふりしていました問題が、
以外にもサクッ🍘と解決してしまいなんだか😦だったのですが、
落とし穴なポイントが有りましたので、公開いたします。

今回は超初期段階です、これから複雑な実装を行いますので、
また投稿したいと思います。

最終目的

Rubyで作ったプログラムをElectronから実行して、標準出力を受け取って、
画面に表示させたいですね。プログレスバーに反映できれば great!ですね。

イメージ
Rubyで進行状況のパーセンテージ計算 => 数値をstdout
Node.jsで受け取り => GUIのプログレスバーデザイン部分のwidthに随時反映

初期段階

まずは Node.js から外部コマンドで、簡単な Ruby コードを実行してみます。
エラーもどうなるか合わせてみてみます。



# coding: utf-8
Encoding.default_external = 'UTF-8'

begin

  5.times {
    print "HELLO WORLD!"
    sleep(0.5)
  }

  raise "ERROR"

rescue => ex
  print ex.class
  print ex.message
  print ex.backtrace
end


Node.js は以下のようにspawnを使います。


const spawn = require('child_process').spawn;
const ls = spawn('ruby', ['hello.rb']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});


参考:Child Process Node.js v5.5.0 Manual & Documentation

でもはじめは実行してもうまく行かなかったんですよね😿

原因

原因は2つありました。

– Ruby側のstdoutp出ないとダメ
putsでもprintでも実験したらダメでした。
– ちゃんとターミナルでしてなかったのでダメ
Sublime Text3のビルドツールでやってました。

p以外でやった場合は、随時ではなく全て終わってから帰ってきますね。
SublimeText3のビルドツールでrunすると以下のエラーが出ました。


events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: spawn ruby ENOENT
    at exports._errnoException (util.js:856:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
    at onErrorNT (internal/child_process.js:344:16)
    at nextTickCallbackWith2Args (node.js:474:9)
    at process._tickCallback (node.js:388:17)
    at Function.Module.runMain (module.js:449:11)
    at startup (node.js:139:18)
    at node.js:999:3

以上、簡単ではございましたがご紹介でした。

Rubyスクレイピング Mechanize の設定をクラス定義でまとめて使い回す : 連載-2

Overview – 概要

対象のgemでいつも決まって使用する設定たちや、
よく使うプロセスをオリジナルに定義したクラスでまとめて、リユースできるようにする。
今回は実際に仕事で必要になったMechanizeを例として使っています。

ちょっと詰まりましたので、忘れないようにアウトプット! 😐

Contents – 目次

1. Intention – 目的
2. Examples – 例
3. References – 参考文献
4. Revision – 改訂

1. Intention – 目的

Mechanize使用時に、いつも共通で行っている設定やよく使うメソッドを
専用クラスで定義して、使いまわせるようにする。


  require 'mechanize'

  agent = Mechanize.new
  agent.user_agent_alias = 'Windows Chrome'
  agent.ca_file = "../etc/cacert.pem"
  agent.keep_alive = false
  agent.max_history = 1
  agent.open_timeout = 60
  agent.read_timeout = 180

基本的に使用する上記の設定を専用に定義したクラスのinitializeで実行する。
※注意:6行目 (agent. 3行目) のca_fileは、外部ファイルを指定しているので上記コードコピペでは使用不可。後日別投稿にて解説予定。

2. Examples – 例

失敗例から紹介しますね。
はじめは何も考えずに、さくっと以下のコードにしてしまったんですね。


  require 'mechanize'

  class MechanizeHelper
    def initialize
      agent = Mechanize.new
      agent.user_agent_alias = 'Windows Chrome'
      agent.ca_file = "../etc/cacert.pem"
      agent.keep_alive = false
      agent.max_history = 1
      agent.open_timeout = 60
      agent.read_timeout = 180
      return agent
    end
  end

  # Call part
  agent = MechanizeHelper.new
  page = agent.get('http://www.foo.com/bar.htm')

HEY! 楽勝ですね! 🙂 Let”s run!


mechanize.rb:464:in `get': undefined method `fetch' for nil:NilClass (NoMethodError)
from mechanize_helper_mistake.rb:19:in `<main>'

OMG! 😱

考えてみると、今までこういった使い方をするシーンに出会ったことがありませんでした。
きちんと調べて作りましょう! と調べまして、できましたのが以下のコードです。


  require 'mechanize'

  class MechanizeHelper < Mechanize

    def self.initialize
      super
      self.user_agent_alias = 'Windows Chrome'
      self.ca_file = "cacert.pem"
      self.keep_alive = false
      self.max_history = 1
      self.open_timeout = 60
      self.read_timeout = 180
      return self
    end
  end

  agent = MechanizeHelper.new
  page = agent.get('http://www.foo.com/bar.htm')
  # => Success!

Tada! 🎉 やりましたね!

私のケースでは設定値はほとんど変えることがないので、直接書き込んでいます。
しかし、外部ファイルに分けて読み込ませたり、呼び出しごとに引数を設定してもいいでしょう。
あとは他にも良く使うプロセスを考えて、メソッドとして追加していこうと思います。

3. References – 参考文献

📚 LINK : Qiita – Rubyのクラスメソッドとインスタンスメソッドの例
👤 AUTHOR : tbpgr様 2015/06/30

今回は上記を参考にさせていただきました。
ありがとうございました。THX! 😆 Pretty awesome!

4. Revision – 改訂

Qiitaにて、偉大なるプログラマー様からご指摘がございました。
大変すみません。謹んで修正いたしました。


  require 'mechanize'

  class MechanizeHelper < Mechanize

    def self.initialize
      user_agent_alias = 'Windows Chrome'
      ca_file = "cacert.pem"
      keep_alive = false
      max_history = 1
      open_timeout = 60
      read_timeout = 180
    end

  end

P.S.
このブログのデザインを早く作りたいですね。
でも忙しいですね 😿

そして、ワードプレスのemojiが可愛いことを今知りました。
私はAndroidのデザインが一番かわいいと思います。
🔗 LINK : Emojipedia
Emoji

Rubyスクレイピング User-Agent 設定が必須 : 連載-1

こんにちは

開発チーム プログラマーのアレックスです。
今年も、いよいよ最後の日になりましたね。

私は本日、鏡餅を買ってきました:)

さて、今回の記事は「Rubyでのスクレイピング」についてです。
今後、何回かにわたってスクレイピング技術についての解説を行っていきたいと思います。

目次

1. 記事作成の経緯
2. なぜ必要なのか
3. 詳しい解説

1. 記事作成の経緯

ユーザーエージェントの設定についての文献は、十分ぐらいにありますね。

では、なぜ今更こんな記事を書くのか?です。
続きを読む Rubyスクレイピング User-Agent 設定が必須 : 連載-1

ヤフーショッピングの拡張機能開発で Javascript の if 文を ruby 感覚で書いてハマった

こんにちは。
ARRIBA開発チーム プログラマーの剣豪(けんご)です。

年末ということもあり、社内一様に多忙でございますが、
「このままでは年が明けても投稿されないぞ!」
という思いで、ようやく第一回目がを投稿致します。

記念すべき第一回目ではございますが、
ライトなネタで、さくっと行きたいと思います。

自身でもこれは凡ミスだとと思ったネタですが、
思い込みとは怖いものです。
有り得そうかな?と思ったので備忘録的な意味も込めて書きます。

私はしっかりと勉強した言語はRubyが初めてで、
もともとWEB畑でしたが、HTMLとjsをコピペで修正しながら使えるようなものでした。

しかしながら、最近は業務で必要なChrome拡張機能の開発や、
Web制作の受注が多くなってきたため、強制的にJavaScriptをやっております。
と言いましてもほとんどJQuery有りきの、まだまだJavaScript弱者ですが・・・
さて、前置きはこれぐらいで本題に。

本日、拡張機能開発で、こんなふうなコードを書いておりました。

続きを読む ヤフーショッピングの拡張機能開発で Javascript の if 文を ruby 感覚で書いてハマった