rails DBのトランザクション
ActiveRecord::Base.transaction do
〜end
の間に記述する
ActiveRecord::Base.transaction do
if !User.create( args )
#失敗時の処理
end
if !User.category.create( args )
#失敗時の処理
end
end
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更新するかも)こっちのブログを書いていく予定です。
通信端点が接続されていません
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が別れていることがわかる