既に該当するモデルの値が存在していたら update で値を更新して、まだ存在しない場合は create で新しくモデルのインスタンスを作成したい時ありませんか? 少なくとも自分にはありましたし、検索でここに辿り着いたあなたもきっとあると思います。
Railsならきっと簡単な方法があると思ったので調べてみたらありました。
やり方。 こんな感じでOK。
my_class = ClassName.find_or_initialize_by_name(name) my_class.update_attributes( :street_address => self.street_address, :city_name => self.city_name, :federalid => self.federalid, :state_prov_id => self.state_prov_id, :zip_code => self.zip_code ) 注意点 ちなみに create_or_update は ActiveRecord::Callbacks の private 関数として用意されてるご様子。
[create_or_update (ActiveRecord::Callbacks) – APIdock][1]
参考 [ruby – create_or_update method in rails – Stack Overflow][2]
Ajaxの処理をRailsでするときはControllerに
respond_to do |format| format.js end と書いてたんですが、いちいちブロック引数に format を使って処理するのは無駄な気がしたので一行で書ける方法を調べてみた。
解決策 respond_to :js でOKでした。
respond_to :html, :js な書き方もOKなようです。
参考 [respond_to (ActionController::MimeResponds::InstanceMethods) – APIdock][1]
開いてるファイルをそのまま実行できるsmart-compileでGemfileを開いてたらbundle installを実行したかったのでやり方を調べてみました。
設定方法 どうやらsmart compile は自動的にコマンドの実行ディレクトリをファイルがある場所に移動してくれるようなので単純に Gemfileというファイル名とbundle installのコマンドを他のファイルと同じように紐付ければOKのようです。
(global-set-key (kbd "C-c C-x") 'smart-compile) (setq smart-compile-alist (append '(("\\.rb$" . "ruby %f")) '(("\\.php$" . "php %f")) '(("\Gemfile$" . "bundle install")) smart-compile-alist)) もちろん ruby や php を使ってなかったら該当行は必要ありません。
使い方 これで Gemfile を開いて C-c C-x するとこんな風に bundle install が実行されます。
-*- mode: compilation; default-directory: "~/dev/foo/" -*- Compilation started at Sun Dec 15 16:29:42 bundle install Using rake (10.1.0) Using i18n (0.6.9) from git://github.com/svenfuchs/i18n.git (at master) Using minitest (4.
Railsの学習がてらに2chもどきをつくろうと思って `rails new 2ch` してみるとエラーになる。これはいいんだけど、`rails generate Model 2ch` ってエラーを吐かないのに実際は使えないので修正がめんどくさくなるので気をつけましょう。
Railsでこんなdeprecatedの警告が出てきたので対処方法を調べた。
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message. 対策 config.i18n.enforce_available_locales = true でOK, `locale validation` をきちんとするなら true、どうでも良いならfalseらしい。よくわかんない。
参考 [ruby – Rails I18n validation deprecation warning – Stack Overflow][1]
Zurb-FoundationとかTwitter bootstrapを使ってると、アイコンをリンク内に含めたくなったりしますよね。こんな感じに
[crayon lang=”html”]
Reload
[/crayon]
でもこれをそのまま `link_to` で囲んで
[crayon lang=”html”]
<%= link_to “ Reload”,”http://example.com/reload” %>
[/crayon]
とすると``タグがHTMLエスケープされて悲しい事態になるんです。
対策 なのでそういう時は `link_to` さんはブロックが取れるのでブロックを使って処理しましょう。ブロックの返り値がリンクのテキストになります。
[crayon lang=”html”]
<%= link_to “http://example.com/reload", class: ‘reload’ do %>
Reload
<% end %>
[/crayon]
ちなみに `button_to` も同じような関数なのでこういう風にかけます。
[crayon lang=”html”]
<%= button_to “”, class: ‘small radius’ do %>
Reload
<% end %>
[/crayon]
これ知らない時に必死にHTMLエスケープされないために何をすればよいのかを探しまくったのは今では良い思い出でもなんでもありません。時間返せ。
参考 [ruby on rails – link_to in helper with block – Stack Overflow][1]
そのまま unique 条件付の index を追加しようとするとエラーになるので
まず既にある index を削除してから追加しましょう。
[crayon title=”db/migrate/add_unique_constraint.rb”]
def change
remove_index :editabilities, [:user_id, :list_id]
add_index :editabilities, [:user_id, :list_id], unique: true
end
[/crayon]
参考 [ruby on rails – How to add unique constraint to already existing index by migration – Stack Overflow][1]
RailsのModelは常に単数名詞、そしてControllerはその名詞の複数形という規則がありますが、Modelが”Child”などの不規則変化名詞だった時にController名はChildrenなのか、Childsなのかがわからなかったので調べました。
答え プログラム的には当然簡単に処理できるChildsだと思ったけども実際はちゃんと不規則変化にも対応してるらしくChildrenが正解です。
その他の不規則名詞 他の不規則名詞は
https://github.com/rails/rails/blob/4-0-0/activesupport/lib/active_support/inflections.rb
に載っているんですが、
inflect.irregular('person', 'people') inflect.irregular('man', 'men') inflect.irregular('child', 'children') inflect.irregular('sex', 'sexes') inflect.irregular('move', 'moves') inflect.irregular('cow', 'kine') inflect.irregular('zombie', 'zombies') zombieって不規則名詞なの…?
cow→kineの変化はそもそも英単語がわかりませんでした、、
Zombieが不規則名詞の理由 ([2013/12/14] 追記) 単数形から複数形への変化は規則通りですが、複数形から単数形への変化 zombies -> zombie が不規則で、規則通り変化させてしまうと zombies -> zomby になってしまうから不規則名詞らしいです。英語は難しいですね。
情報元 [Model and Controller's naming rule for irregular noun in Rails – Stack Overflow][1]
rails new hoge
とすると
`expand_path': non-absolute home
というエラーが出てしまって「Windowsだしなあ。」と諦めかけてたけど、このhomeというのは環境変数のHOMEのことらしく、確かにcygwinを使う時のためにHOMEに /cygdrive/ から始まる値を入れてたのを思い出したので環境変数 HOME を削除してみたら動いた。
ちなみに irb もHOMEに入ってる値によっては動かないらしい。
参考 `expand_path': non-absolute home
http://devnet.jetbrains.com/thread/437313
画面遷移無しでファイルのアップロードしようと思ったらiframeを使った技とかややこしい情報が色々出てきて、なかなかやりたいことに辿りつけなかったのでメモ。
やりたい事と条件 ・ajaxなテキストファイルのアップロード
・テキストをRubyで編集して返す
・画面遷移せずに結果を表示
・IEは諦める。
必要最低限のコード まずHTMLを用意
ajaxupload.html
`
<script type="text/javascript" src="ajaxupload.js" charset="utf8"></script><br>
textarea{height:80%;width:100%;}
` つぎにjavascript
ajaxupload.js
`
$(function(){ $("#upload").click(function(){ var file = $("#file")[0].files[0]; var reader = new FileReader(); reader.readAsText(file, 'UTF-8'); reader.onload = showFile; }); function showFile(event) { $.ajax({ type: "POST", url: "ajaxupload.rb", data: { filedata:event.target.result} }).done(function(msg) { $("#output").html(msg); }); } }); ` んで何か処理をするRubyのスクリプト。ここではファイルの中身をそのまま返してるだけ。(パス名は適宜変更してください。)
ajaxupload.rb
`
#!P:\Dropbox\bin\RailsPortable\App\Rails\bin\ruby.exe require "