rails には 値の有無をチェックするときにタブやスペースなどの空白が入っていても「空」だと判断する便利な blank? 関数が用意されていますが、どうやら JavaScript や jQuery には用意されてないので追加してみました。
自分で書いた後にもっと良さそうなコードを見つけたのでそちらを紹介します。
JavaScript $.fn.isBlank = function() { return !$(this.html()) || $.trim($(this).html()) === ""; }; Coffee もちろん Rails 標準のCoffeeも。
$.fn.isBlank = - !$(@.html()) || $.trim($(@).html()) is "" 参考 [Checking for blank input with jQuery – Stack Overflow][1]
[jQuery isBlank() | LakTEK (Lakshan Perera)][2]
Railscasts のTwitter の項目通りに書いてると since_id parameter is invalid. のエラーでつまづきました。
どうやらTwitterAPI1.1からの変更で since_id に `` を指定できなくなったのが原因のようです。
もちろんレコードにすでにつぶやきが入ってれば問題ないんですが初回の何も入ってない時にこけてしまうわけです。
対策 user.twitter.list_timeline(list_id, since_id: [maximum(:tweet_id),"1"].max) と返り値に最低でも1が入るようにしておけばOKです。文字列にしてるのは twitter_idを文字列で保持してるからです。
参考 [API v1.1 statuses/user_timeline since_id parameter is invalid | Twitter Developers][1]
attr_accessibleはRails4では使えなくなったのにユーザー管理の定番 gem deviseではまだ使っているようなので新しい昨日の Strong parameter に書き換えておきましょう。
具体例 devise の設定で User モデルにこんなのが書いてると思うので
attr_accessible :email, :password, :password_confirmation その行を削除して下の方にこれを追加しましょう。
private def user_params params.require(:user).permit(:email, :password, :password_confirmation) end 参考 [attr_accessible][1]
何故だか理由はさっぱりわかりませんが、どうにもおかしな動きが route.rb をいくらいじってもなおらないので色々情報を探してたら、config の omniauth.rb を消したら動きました。
consumer_key とかは devise.rb に書いておきましょう。
参考 [ruby on rails 3 – Authentication failure : Devise + OmniAuth + Twitter – Stack Overflow][1]
devise と omniauthを組みわせて使うと default の email と encrypted_password が必ず値を持たなければならない null => false の制限が邪魔だったのでMigrationで削除しようとしたけど方法がわからなかったので調べてみた。
やりかた class RemoveConditionFromUser < ActiveRecord::Migration def change change_column :users, :email, :string, null: true change_column :users, :encrypted_password, :string, null: true end end 参考 [Rails Migration: Remove constraint – Stack Overflow][1]
既に該当するモデルの値が存在していたら 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]
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]