読者です 読者をやめる 読者になる 読者になる

IT分からんわ~_~;

IT色々お勉強中のブログ

rails ファイルアップロードなんどやっても忘れるのでメモ

ジェネレータでup用クラス作成

rails g uploader Image

つけた名前のあとにUploaderて名前がついたファイルが出来るっぽい

モデルとアップデートファイルを結びつける

  mount_uploader :about_image1, ImageUploder
  mount_uploader :about_image2,ImageUploder

S3に入れる場合 initializersにcarrierwave.rbとか作って設定入れる

Uploaderファイルを変更

  include CarrierWave::RMagick

  #S3に上げるのでfogを使う
  storage :fog
  #S3保存するディレクトリ場所
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #キャッシュファイルの置き場所をルートから変えたい時設定
  def cache_dir
    "uploads_tmp/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  #変換したファイルのファイル規則
  def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end

上でファイルと結びつけたカラムをマイグレーションで作成、複数の場合はファイル保存用テーブル作成

class NoticeFile < ActiveRecord::Base
  belongs_to :hogeration

  acts_as_paranoid

  mount_uploader :file_path, NoticeUploader
end

viewを準備 hiddenフィールドをつけるとバリでショーンエラーになっても値が消えない。でもモデルに定義されてないとダメっぽ‥

  .row
    .col-xs-12.col-sm-4
      = f.label "添付ファイル"
    .col-xs-12.col-sm-8
      - (1..3).each do |key|
        = f.file_field "about_image#{key}".to_sym, class: 'file-inline'
        = f.hidden_field :"about_image#{key}_cache"

後は適当にコントローラで保存すればおk ←書くのがメンドクサクなった

メソッドの定義場所を調べる方法

methodで#Methodを取り出す

(byebug) m=co.method(:is_entry?)
#<Method: Hoge#is_entry?>
(byebug) m.source_location
["(eval)", 1]
(byebug) m.owner

hoge.methods.grep /target/i
hoge.methods - Object.methods

rails n+1解決のincludesの使い方すぐ忘れるのでまとめ

hoge has_many pogeの場合

Hoge.includes(:poges)

複数の場合

Hoge.includes(:poges,:ages)

ネストされたリレーションの場合

Hoge.includes(:poges,ages:[:doge,boge])
//またはcomの下にtranslationsがある場合
includes(colb: [com: :translations])

includes (ActiveRecord::QueryMethods) - APIdock

↓ちなみに

ActiveRecordでのレコード数のカウント方法

count SQLのCOUNTを使ってカウント(キャッシュ使わない length SQLの実行結果の行数をカウント(キャッシュ使う size SQLのCOUNTを使ってカウント(キャッシュ使う

react学習中

constructor: (props)->

コンポーネントがマウントされる前に呼ばれる。コンストラクタを自分で実装したい場合は

super(props)

を必ず呼ばなければならない。状態を初期化する場所 propsはreadonly stateは変更可能 defaultはpropsとして自分自身の値を参照する場合はhoge デフォルト値を設定する場合はage

    this.state =
      hoge: this.props.hoge
      age: 'age'
componentDidMount: ->

このメソッドはコンポーネントレンダリングされた時にReactが自動で呼び出すメソッドです。Reactではthis.setState()メソッドが呼ばれると新しくstateを設定すると同時に再レンダリングを行います。このcomponentDidMount()メソッドはサーバーからデータを取得してそのデータを元にコンポーネントの再レンダリングを行っています。コンポーネント作成後に実行されるようになっています

  • イベントハンドラ イベントが発生したときに呼び出される処理のこと JavaScriptにおける「イベントをキャッチするグローブ」のこと

  • e.currentTarget.value イベントバブルにおける現在のイベントのDOM要素を返すプロパティ。

  • イベントバブルとは、子要素のイベントが発生すると、その親要素や先祖要素の同じタイプのイベントが発生すること。

へなちょこエンジニア、railsでreact使ってみる

react jsx生成コマンド

rails g react:component CommentBox

react_componentというhelperメソッド

react_component('CommentBox')

値を参照する時に使う

this.props.hoge

値を変更する時に使う

this.setState({ count: this.state.hoge + 1 });

refs divで設定した値とかを参照

console.log(this.refs.myDiv.props.children);  // xxx
render() {
    return (
      <div ref="myDiv">xxx</div>
    );
  }

getDOMNode DOMにフォーカスあてたりする

this.refs.myDiv.getDOMNode().focus();

nginx の自動起動覚書

linuxの場合

sudo chkconfig --add nginx
sudo chkconfig nginx on

macの場合

cp /usr/local/Cellar/postgresql/9.5.0/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

ruby例外処理捕捉について(slack)

railsで捉えたいexceptionの種類 library _builtin (Ruby 2.1.0)

raiseの仕方 https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#raise

エラーのgem GitHub - smartinez87/exception_notification: Exception Notifier Plugin for Rails

rescue_fromとすることでbeginとかしなくてもそのクラスで起きたエラーを拾ってくれる StandardErrorはちょっと色々広いすぎるので何ですが、、自分でエラーを定義したければlibとかで共通に作る

slack例

  rescue_from StandardError do |exception|
    alert_exception(exception)
  end

  def perform(message, channel='dev')
    hook = Rails.configuration.x.send("slack_#{channel}")
    notifier = Slack::Notifier.new hook, http_options: { open_timeout: 2 }
    notifier.username = channel
    notifier.ping message
 end

  private
    def alert_exception(e)
      ExceptionNotifier.notify_exception(e)
    end