rails勉強してます3

よくあるファイルアクセス権限系の話しでアップロードされたpdfをDB保存 & embedタグでDBに保存したpdfを表示

migration

$ rails g model pdf name:string data:binary

$ rails db:migrate

controller

#html表示
def template
  @pdf = Pdf.new
end

#DB保存したバイナリを返す
def show
  @pdf = Pdf.last
  if @pdf.nil?
    send_data(@pdf.data, :disposition => "inline", :type => "application/pdf")
  end
end

#バイナリデータの保存
def create
  @pdf.name = params[:pdf][:data].original_filename
  @pdf.data = params[:pdf][:data].read
  @pdf.save
  render 'template'
end

view

<embed src="<%= show_path %>" width="425" height="400"></embed>
<%= form_for(@pdf, url:create_path, method: :post) do |f| %>
<%= f.file_field :data %>
<%= f.submit "画像を投稿する" %>
<% end %>

validateはまだ(^_^;)

rails勉強してます2

はまったりしながらだけど。

objectの情報をログにdump

# plain
logger.debug object.inspect
# yaml
logger.debug object.to_yaml

FKのnilを許可

belongs_to :tablename, optional: true

レコード削除時にリレーションテーブルも削除する

has_many :tablename, dependent: :destroy

リモートサーバにある画像ファイルをCarrierWaveで保存

mount_uploader :columnname, ExampleUploader
# カラム名がimage_urlとかだとremote_image_url_url になる
model.remote_columnname_url = "http://example.org/xxxx.png"
model.save

多対多のモデル表現

has_and_belongs_to_manyを使うと楽

中間テーブルの作成

class CreateGroupsUsers < ActiveRecord::Migration
  def change
    create_table :groups_users, id: false do |t|
      t.references :group, index: true, null: false
      t.references :user, index: true, null: false
    end
  end
end

中間テーブルのidはあってもなくても良い

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
end
class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
end

中間テーブルへの登録は << 演算子を使う

user = User.find( 1 )
group = Group.find(1)
user.groups << group

rails勉強してます

rails勉強してます

このあたりを再学習

  • debugger
  • コールバックメソッド
  • validationのコンテキスト別呼び出し
  • S3へのファイル保存
  • 多対多のリレーション定義
  • テスト

ちなみにcloud9 + EC2のt2.nanoだとメモリが足らなくて途中からテストが走らなくなります(^_^;)

退職します

ほぼスタートアップから11年間勤めた会社を退職します。

5月末日の退職予定で現在、40日の有給消化中です。

有給中、暇なので初対面の方でも、飲みにとか誘ってもらえると喜びます。

このブログはこのまま残しておいて(気がむいたら今後も月1更新するかも)こっちのブログを書いていく予定です。

letitride.hatenablog.jp

通信端点が接続されていません

lsを打った時にs3fsでマウントしてあったディレクトリが以下のレスポンスを返す時がある

-bash-4.1$ ll 
ls: dirname にアクセスできません: 通信端点が接続されていません
合計 1
d?????????  ? ?        ?             ?             ? dirname

/var/log/messages

Feb 28 06:40:57 hostname kernel: [97762813.804415] s3fs[2363]: segfault at 7fb400000020 ip 0000000000440302 sp 00007fb404ff8610 error 4 in s3fs[400000+61000]

調べてみると結構頻繁に起こるような記事がチラホラ。
unmount -> mountで再マウントすると治るが... 大事な運用するには注意が必要ですな。

chrome custom tabsの挙動の話し

Androidアプリでchrome custom tabsでwebページを開くって処理があったんだけど、以下2つの謎な挙動が起こった

  • CCTが複数起動して、閉じるを押しても背面のCCTが再描画
  • CCTが外部アプリとして起動してアプリ上に乗っからない


CCTが複数起動して、閉じるを押しても背面のCCTが再描画 のケース

これは、バーコードをスキャンして、その読み取った情報をパラメータにしてWEBページを開いていたんだけど、スキャンがカメラのブレやピントのずれとかで、複数回読み取りが成功してた模様。で、スキャン完了のコールバックでCCTを開いていたからという落ち。


CCTが外部アプリとして起動してアプリ上に乗っからない のケース

chromeを初回起動時にchromeの規約同意を求められるんだけど、規約同意していない時に外部アプリとして起動する。
この時、OSのアプリタスクリスクを表示すると、起動元のアプリとchromeが別れていることがわかる