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

クズと天才は紙一重

不定期更新です。主に日々の活動記録( ・ㅂ・)و ̑̑

セレクトボックスをAjaxで動的に変える

Ajaxを使って動的にセレクトボックスを変える

config/routes.rbにパスを追加

 

resources bookshelfs do
  get 'ajax' => "bookshelfs#ajax", on: :collection
end

 

viewを編集

 

 = simple_form_for Bookshelf.new do |f|
#changeSelect onchange="entryChange();"
 = f.input :category, collection: @categories, input_html: {id: 'category_select'}
#firstBox
 = f.input :name, collection: @books, input_html: {id: 'name_select'}
 
javascript:
 function entryChange(){
  if(document.getElementById('category_select')){
   category = document.getElementById('category_select').value;
   if(category){
    $.ajax({
     type: 'get',
     url: "/<>bookshelfs/ajax",
     data: {category: category},
     dataType: 'html',
     success: function(data){
      $('#name_select').empty();
      $.each(JSON.parse(data), function(){
       $('#name_select')
        .append($("<option></option>")
         .attr("value",this[0])
         .text(this[1]));
      });
     }
    });
    document.getElementById('firstBox').style.display = "";
   }else{
    document.getElementById('firstBox').style.display = "none";
   }
  }
 }
window.onload = entryChange;

 

controller側を編集

def new
 @categories = [["IT","IT"],["経済","経済"]]
 @books = []
end
 
def ajax
 books = Book.where(category: params[:category])
 render json: books.map{|b| [b.name,b.name]} if request.xhr?
end

 

こんな感じでAjaxを使ってセレクトボックスを動的に変えることができます

 

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を導入していたらこちらも実行する。

modal

erbでの記述

<div class="modal fade" tabindex="-1" role="dialog" data-backdrop="false">
 <div class="modal-dialog" role="document">
  <div class="modal-content">
   <div class="modal-header">
   <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
   <h4 class="modal-title">タイトル</h4>
   </div>
   <div class="modal-body">
   </div>
  </div>
 </div>
</div>

 

slimでの記述

.modal.fade tabindex="-1" role="dialog" data-backdrop="false"
 .modal-dialog role="document"
  .modal-content
   .modal-header
   button type="button" class="close" data-dismiss="modal" aria-label="Close" &times;
   h4 class="modal-title" タイトル
   .modal-body

data-backdrop="false"

黒い画面と画面外をクリックした時に、閉じるのをなくすオプション。

 

jsの

$('.modal').modal('show');

$('.modal').modal('hide');

で開いたり、閉じたり

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で取得したアクセストークン>

 

Facebookのアクセストークンを取得して、

以下のスクリプトを実行する。

 

require "rubygems"
require "fb_graph"
keyword = 検索するキーワード
access_token = 取得したアクセストーク
events = FbGraph::Event.search(keyword, access_token: access_token, since: Time.now.to_i)

 

これでイベントが取得できます。