Sidekiq
RailsのActiveJobには、未来に登録したJobをキャンセルするサポートがありません。
なので、Job実行にSidekiqを使い、キャンセルにSidekiqのAPIを使います。
Gemfile
に以下を追加して、bundle install
gem 'sidekiq'
config/sidekiq.yml
に以下を記述
:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
- default
Active JobがSidekiqを使用することを、config/application.rb
に記述する。
config.active_job.queue_adapter = :sidekiq
キャンセルはこんな感じで行います。
require 'sidekiq/api'
job = ジョブ名.set(wait_until: Date.tomorrow.noon).perform_later(*args)
job.job_id #これでジョブを特定するIDがわかる
job_list = Sidekiq::ScheduledSet.new
job_list.find{ |job| job.arga[0]['job_id'] == job.job_id }.delete
ジョブ実行をSidekiqに変更したので、ローカル開発時は
redis-server
でRedisを立ち上げた後、
別ターミナルでbundle exec sidekiq
でSidekiqを立ち上げて
Jobを使いましょう
Rails Active Job
Active Jobは、
時間差で処理を実行できるようなものです。
Jobの作成方法は、以下のコマンドを実行
rails g job ジョブ名
以下のようなジョブができます
class ジョブ名 < ActiveJob::Base
queue_as :default
def perform(*args)
# 実行したいことを書く
end
end
*argsの部分に自由に引数を入れられます。
Jobを呼び出す方法
一週間後に実行したい場合
ジョブ名.set(wait: 1.week).perform_later(*args)
すぐに呼び出したい場合
ジョブ名.perform_now(*args)
特定の時間に呼び出したい場合
now_time = Time.now.to_i (現在時刻)
release_time = リリースする日時と時間
wait_time = (release_time - now_time)
ジョブ名.set(wait: wait_time.seconds).perform_later(*args)
wait_time.secondsで差分を秒に変換してJobをセットしています。
他にも、Jobオプションは、いろいろあるので調べてみてください
Line::Bot::APIでpush通知
Gamfile
に以下を追加してbundle install
gem 'line-bot-api'
使いたいところに以下を記述するだけ
require 'line/bot'
client = Line::Bot::Client.new { |config|
config.channel_secret = "<SECRET_TOKEN>" config.channel_token = "<ACCESS_TOKEN>" }
message={ type: 'text', text: '(送信したいメッセージ)' } user_id = uから始まるLINEの送信先識別子 response = client.push_message(user_id, mesage)
成功した場合200が返ってくる
shellで確認可能
curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-d '{
"to": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"message":[
{
"type":"text",
"text":"(送信したいメッセージ)"
}
]
}' https://api.line.me/v2/bot/message/push
これは一人のユーザに対してなので、
Multicastを使いたい場合は以下のようにする
require 'line/bot'
client = Line::Bot::Client.new do |config|
config.channel_token = "#{ACCESS_TOKEN}"
end
user_ids = ['user1','user2']
message = {
type:'text',
text:'(送信したいメッセージ)'
}
response = client.multicast(user_ids, message)
Multicastはshellがうまく動作しないので省く
railsでbootstrapを導入した時にDEPRECATION WARNINGがうるさかった話
railsでbootstrapを導入する方法は
Gamfileに以下を追加する。
gem 'therubyracer'
gem 'less-rails
gem 'twitter-bootstrap-rails'
その後、以下コマンドを実行
rails g bootstrap:install
bootstrapは使えるようになるのだが、
rails s
でサーバを起動した時に
DEPRECATION WARNING
がうるさいので
gem 'less-rails'
のところにこれを追加する。
gem 'less-rails', git: 'https://github.com/MustafaZain/less-rails'
するとDEPRECATION WARNING
が出なくなる。
もし、simple_form
を導入していた場合
rails generate simple_form:install
をしろというエラーも出るので
simple_form
を導入していたらこちらも実行する。
Facebook APIでイベント情報を習得する
Facebook Graph APIへのアクセスをサポートしてくれる
gemを導入します。
Gamfile
に以下を追加して、bundle install
を実行
gem 'fb_graph'
APPIDとアプリのシークレットキーを取得
https://developers.facebook.com/apps
ユーザアクセストークンを取得
https://developers.facebook.com/tools/explorer/
または、
https://developers.facebook.com/tools/access_token
このままだと、トークンの期限は1時間だけです。
このURLに、必要箇所にトークンを入れてアクセスすれば
60日に期間が伸びます。
https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=<App ID>&client_secret=<アプリのシークレットキー>&fb_exchange_token=<Graph API Explorerで取得したアクセストークン>
以下のスクリプトを実行する。
require "rubygems"
require "fb_graph"
keyword = 検索するキーワード
access_token = 取得したアクセストークン
events = FbGraph::Event.search(keyword, access_token: access_token, since: Time.now.to_i)
これでイベントが取得できます。
railsでpostgresqlを使う
簡単なまとめなので、間違えているところがあるかもしれないです。
railsでPostgreSQLを使いたい場合は
rails new プロジェクト名 -d postgresql
を実行し、プロジェクトを作成します。
config/databese.yml
を編集します。
development:
adapter: postgresql
host: localhost
encoding: utf8
port: 5432
databese: 作成したデータベース名(作成するデータベース名)
username: 作成したユーザ名
password: 作成したユーザのパスワード
test:
adapter: postgresql
host: localhost
encoding: utf8
port: 5432
databese: 作成したデータベース名(作成するデータベース名)
username: 作成したユーザ名
password: 作成したユーザのパスワード
ユーザを作成していれば、
rake db:create RAILS_ENV=development
でデータベースは自動で作成されます。
PostgreSQLがない場合は、以下コマンドを実行してインストールします。
brew install postgresql
PostgreSQLを実行する場合は、以下コマンドを実行します
postgres -D /usr/local/var/postgres
または、
pg_ctl -D /usr/local/var/postgres start
PostgreSQL起動後は、実行したまま、別ウィンドウで作業することになります。
ユーザを作成したい場合は、
createuser -P ユーザ名
-Pはオプションでユーザにパスワードをつけたいときに使います。
ユーザに権限をつけたい場合は、
psql -d postgres
で
PostgreSQLに入り
ALTER ROLE ユーザ名 WITH SUPERUSER;
で権限をつけられます。
また、逆に権限をなくしたい場合は、
ALTER ROLE ユーザ名 WITH NOSUPERUSER;
で権限を剥奪できます。
ユーザを削除したい場合は、
psql -d postgres
でPostgreSQLに入り
DROP USER ユーザ名;
で削除できます。
ユーザ一覧を見たい場合は
psql -d postgres
でPostgreSQLに入り
\du
で確認することができます。
データベースを作成するときは、
createdb データベース名 -O ユーザ名
で作成できます
-O ユーザ名はオプションで、
作成するデータベースの所有者となるユーザを指定できます。
データベースを削除したい場合は、
psql -d postgres
でPostgreSQLに入り
DROP DATABASE データベース名;
で削除できます。
データベース一覧を見たいときは、
psql -l
でデータベースを確認できます。
jpostal.jpで住所を自動入力
jpostal.jpという、Nintonという日本の会社が開発している。
郵便番号から住所を自動入力するjQueryプラグインがあります。
これを使って、Railsで郵便番号から住所を自動で入力してくれる
フォームをつくります。
https://github.com/ninton/jquery.jpostal.js/
こちらより、
jquery.jpostal.js
というファイルを習得し、
vendor/assets/javascripts/
に追加する。
assets/javascripts/application.js
に以下を記述
//= require jquery.jpostal
assets/javascripts/
にaddress.coffee
を作成し、以下を記述
$ ->
$("#address_zipcode").jpostal({
postcode : [ "#address_zipcode" ],
address : {
"#address_prefecture_name" : "%3",
"#address_city" : "%4%5",
"#address_street" : "%6%7"
}
})
今回は、住所をユーザに紐づけたのでこんな感じに編集
<%= simple_form_for (@user) do |f| %>
<%= f.input :name %>
<%= f.input :post_number, input_html:{id:"address_zipcode"} %>
<%= f.input :address_city, input_html:{id:"address_city"} %>
<%= f.input :address_prefecture_name, input_html:{id:"address_prefecture_name"} %>
<%= f.input :address_street, input_html:{id:"address_street"} %>
<%= f.button :submit %>
<% end %>
これで完成です。
郵便番号を入れると住所が自動で入力されます。