Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/timakin/apper
apper
https://github.com/timakin/apper
Last synced: about 1 month ago
JSON representation
apper
- Host: GitHub
- URL: https://github.com/timakin/apper
- Owner: timakin
- Created: 2013-04-07T12:15:16.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2014-12-25T16:54:35.000Z (almost 10 years ago)
- Last Synced: 2024-04-17T01:14:03.114Z (7 months ago)
- Language: Ruby
- Size: 1.83 MB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.rdoc
Awesome Lists containing this project
README
= 前提条件
Userテーブル=>Devise
Itemテーブル=>記事を作成する。title:string text:textでscaffold= CarrerWave File Uploading
ASCIICASTS[http://ja.asciicasts.com/episodes/253-carrierwave-file-uploads]
ほぼまんまでいけるimageカラムをitemテーブルに追加。= Devise 導入
これ[http://kitbc.s41.xrea.com/main/?use_devise]にそってやる。= リレーション
itemモデルに参照元となるuser_idを追加(これ忘れたら作れない。案外これ載っていない。)
rails g migration add_user_id_to_itemsそのあとフォームを利用してuser_idを自動で登録するようにする。
<%= f.hidden_field :user_id, :value => current_user.id %>
こちら[http://neec-is.g.hatena.ne.jp/is178/20091206/1260069121]を見て、試しにEmailアドレスを表示する。
<%= item.user.email %>これをindex.html.erbに追加。
Userテーブルにnameでも追加すれば、簡単に表示ができる。= Mini_magickでページごとに画像調整
RailsGirls[http://railsgirls-jp.github.io/thumbnails/]に載っている。
Mini_magick該当箇所のコメントアウトを外す
app/uploaders/image_uploader.rb
version :thumb do
process :resize_to_fill => [200,200]
endversion :show do
process :resize_to_fill => [300,250]
endのように、versionごとに分けて記載する。
そのあと、viewのitemでthumbならindexのimage_tagの末尾に(:thumb)をつけるなど、各場合についてversionを適用する。
= acts_as_taggable_on
ASCIICASTS[http://railscasts.com/episodes/382-tagging?language=ja&view=asciicast]
をまんま使えば大丈夫。
mapはタイトル検索などで使い分けないといけないかも= bootstrap
application.js,application.cssにrequireを書く
navbarはnavbar-fixed-topにすると、ウィンドウを小さくしても
余白が生まれたりしない。root_pathやdestroy_user_session_pathなどは、liタグの次に書く
<% if user_signed_in? %>
...
<% end %>でnavbarの表示を変える
flat-uiとかも適用できる!やったね!
= サムネイルにリンクはる
こちら[http://d.hatena.ne.jp/satake7/20080908/p1]を参考にする
= 投稿したユーザーのみdestroyとかeditとか表示する
<% if current_user == item.user %>
...
<% end %>itemってとこが重要。
このやり方で他のページもできるよ。= created_atが新しい順に表示する
こちら[https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-talk/gANZDdb8u5s]を参考にする。
例えばif params[:tag]
@items = Item.tagged_with(params[:tag])
@items = @items.sort_by{ |m| m.created_at}.reverse()
else
@items = Item.all
@items = @items.sort_by{ |m| m.created_at}.reverse()
endindexならこんな感じ
= party_boyでフォロー機能
微妙に難しかった
こちら[http://tnakamura.hatenablog.com/entry/20120703/party_boy]rails generate party_boy
マイグレーションファイルの名前のせいでエラーが出るから
class CreateRelationship
...
endにする。詳細はこちら[https://github.com/mnelson/party_boy/issues/6]
これを修正したら、rake db:migrate
こうしてリレーションに必要なテーブルが作成される。
けど、アクセスできない変数があるので、relationshipモデルにattr_accessible :requestor, :requestee, :restricted
と記載する。こうする事でほぼ使えるようになる。
こっからが面倒。まずUserモデルにacts_as_followable
を追加。
その後コントローラー、ルーティング、ビューの順に編集していく。
まずコントローラー。フォロー追加、解除のアクションを追加する。def user_follow
@item = Item.find(params[:id])
current_user.follow(@item.user)
# これはscaffoldのやつと同じで、item_urlにリダイレクトするようになっている。
respond_to do |format|
format.html { redirect_to item_url }
format.json { head :no_content }
end
enddef user_unfollow
@item = Item.find(params[:id])
current_user.unfollow(@item.user)
respond_to do |format|
format.html { redirect_to item_url }
format.json { head :no_content }
end
end次にルーティング。アクションがあったときのpathをitemsのルートに追加する。
resources :items do
member do
get "user_follow"
get "user_unfollow"
end
end最後にビュー。これが鬼門だった……ルーティングを確認してから、以下を追加した。
<% unless [email protected] %>
<% if current_user.following?(@item.user) %>
<%= link_to "Remove", user_unfollow_item_path %>
<% else %>
<%= link_to "Add Friend", user_follow_item_path %>
<% end %>
<% end %>これでおっけー。ついでにフォロワーを表示するには、
@following = current_user.following
をコントローラーに追加した後、ビューに以下を追加すれば良い。
<% @following.each do |f| %>
<%= f.email %>
<% end %>
= sextant
もうrake routesなんていらない。Rail4.0だと標準装備らしい。3.2でも見れる。便利でいいね。
= ログイン、ログアウトの表示を変更する
まあ簡単
<% if user_signed_in? %>
<% else %>
<% end %>
= Ransack
目が飛ぶくらい簡単
こちら[http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]を参考に!
items_controllerのindexに書く。
(今回はtagとの兼用の仕方がわからないので、とりあえずtagの機能をコメントアウト)
#if params[:q][:tag]
# @items = Item.tagged_with(params[:q][:tag])
# @items = @items.sort_by{ |m| m.created_at}.reverse()
#else
@search=Item.search(params[:q])
@[email protected]
@items = @items.sort_by{ |m| m.created_at}.reverse()
#end
indexには検索フォームを作る
<%= search_form_for @search do |f| %>
<%= f.label :title_cont, "Title" %>
<%= f.text_field :title_cont %>
<% end %>
= acts_as_commentable
コメント機能をつける。今回はacts_as_commentableを使う。
こちら[http://yorunocafe.blogspot.jp/2011/08/railsactsascommentable.html]を参照
rails g comment
を忘れないように。今回はuser_idもリレーションのために追加しておいた。
なんかCommentsControllerにしなくちゃいけなかったり、命名規則の部分でミスが多いから、
自分で直すように気をつけないといけない。
あとコメントを表示するモデルの名前をpostから置き換えないと表示できないので注意。
あと、_formと_showの二つを作ってファイルを分割した。
まじで命名規則にそってない解説だから注意。
userモデルとcommentモデルにリレーションを設定すれば、
commentを作成したuserの名前やメールアドレスも表示できる。
ただ、この設定をする以前にuser_idを持たないcommentを作成していると、エラーが出るので注意。
= Public_Activity
こちら〜[http://railscasts.com/episodes/406-public-activity?view=asciicast]
でもこのscreencastには、/app/config/activities_controller.rbとなっていたり(/app/controller/activities_controller.rbがほんと)、
class ActivitiesController < ApplicationController
def index
@activities = PublicActivity::Activity.order('created_ad DESC')
end
end
が書かれていなかったり……
これはdefault_scopeのオプションを参考にして、修正できた。うれしい(´;д;`)
current_userがからんでくると絶対エラーが出る!
この野郎と思ったけど、/app/model/comment.rbには
include PublicActivity::Model
tracked owner: ->(controller, model) { controller && controller.current_user }
を追記。ちゃんとpublic_activityのmodelをincludesなきゃいけない。
あと、current_userについての記述は基本無視していい。
最終的にviewはこんな感じになった。
Activities#index
<% @activities.each do |activity| %>
<% if activity.trackable_type == "Item" %>
<%= activity.owner.email if activity.owner %> made <%= link_to activity.trackable.title, activity.trackable %>
<% else %>
<%= activity.owner.email if activity.owner %> added comment to <%= activity.trackable.user.email %>
<% end %>
<% end %>
added comment to ...の部分を改良できないか?
itemsテーブルとcommentsテーブルの間にリレーションを作り、trackされたcommentの要素の中にあるitem_idを使って、
コメントしたitemのタイトルとそのリンク先を取得。ビューには次のように記載。
<%= activity.owner.email if activity.owner %> added comment to <%= link_to activity.trackable.item.title, activity.trackable.item %>
やったぜ。
= OmniAuthでGoogle & Facebook認証 + Devise
長い時間を要した……
ここ[https://github.com/plataformatec/devise/wiki/OmniAuth%3A-Overview]が一番参考になった。
まずはgemをインストール
gem 'omniauth'
gem "omniauth-facebook"
gem "omniauth-twitter"
gem 'omniauth-google-oauth2'
omniauth用のカラムをUserモデルに追加する。
rake db:reset
したあと、devise_create_users.rbというmigrationファイルを次のように書き換える。
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
##Omniauthable
t.integer :uid, :limit => 8 #bigintにする
t.string :name
t.string :provider
t.string :password
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
## Token authenticatable
# t.string :authentication_token
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
add_index :users, :uid, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
# add_index :users, :authentication_token, :unique => true
end
end
これでもう一度
rake db:migrate
する。次はこのmigrationに乗っ取ってmodels/user.rbを編集。
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook, :google_oauth2]
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
attr_accessible :name, :password, :uid, :provider
# attr_accessible :title, :body
validates :name, :presence => true, :uniqueness => true
validates :email, :presence => true, :uniqueness => true
ちょっとよけいなのも入ってるけど、これでオッケー。
次はconfigの設定。config/initializers/devise.rbを書き換える。というか追記する。
OpenSSL::SSL.module_eval{ remove_const(:VERIFY_PEER) }
OpenSSL::SSL.const_set( :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE )
config.omniauth :facebook, "APP_ID", "APP_SECRET",
{:scope => 'email, offline_access'}
require "omniauth-facebook"
require "omniauth-google-oauth2"
config.omniauth :google_oauth2, "4APP_ID", "APP_SECRET", { access_type: "offline", approval_prompt: "" }
上2行は必要。次にroutes.rbに下を追加。
devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }
ビューに次のリンクを追加。
<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>
<%= link_to "Sign in with Google", user_omniauth_authorize_path(:google_oauth2) %>
その後、もう一度models/user.rbに次を追加。
def self.new_with_session(params, session)
super.tap do |user|
if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
user.email = data["email"]
user.name = data["name"]
end
end
end
def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)
data = access_token.extra.raw_info
if user = User.where(:email => data.email).first
user
else # Create a user with a stub password.
User.create!(:email => data.email, :name => data.name, :password => Devise.friendly_token[0,20], :provider => access_token.provider, :uid => access_token.uid)
end
end
def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
data = access_token.info
if user = User.where(:email => data.email).first
user
else # Create a user with a stub password.
User.create!(:email => data.email, :name => data.name, :password => Devise.friendly_token[0,20], :provider => access_token.provider, :uid => access_token.uid)
end
end
これで最初登録したときにどんな情報が登録されるのかを設定できた。
最後にapp/controllers/users/omniauth_callbacks_controller.rbというファイルを、ディレクトリごと作成。
以下がその内容となる。
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
# You need to implement the method below in your model
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
def google_oauth2
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.find_for_google_oauth2(request.env["omniauth.auth"], current_user)
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Google"
sign_in_and_redirect @user, :event => :authentication
else
session["devise.google_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
end
たぶんこれでオッケー。
その他、deviseでの登録でもnameを登録できるように、views/registrations/new.html.erbに追記。
<%= f.text_field :name %>
ほか、headerに表示されるemailを名前に変更。
まあこれは簡単だろうから省略。
長い道のりだった。
= public_activityでフォローしているユーザーのアクティビティのみ表示
まずviews/activities/index.html.erbを編集。
Activities#index
<% @activities.each do |activity| %>
<% if activity.trackable_type == "Item" %>
<% if activity.owner==current_user %>
You made <%= link_to activity.trackable.title, activity.trackable %>
<% elsif @following.include?(activity.owner) %>
<%= activity.owner.name %> made <%= link_to activity.trackable.title, activity.trackable %>
<% else %>
<% end %>
<% else %>
<% if activity.owner == current_user %>
You added comment to
<%= link_to activity.trackable.item.title, activity.trackable.item %>
<% elsif @following.include?(activity.owner) %>
<%= activity.owner.name %>
added comment to
<%= link_to activity.trackable.item.title, activity.trackable.item %>
<% else %>
<% end %>
<% end %>
<% end %>
そのあと、activities_controller.rbに追記。
@following = current_user.following
これでよし。
= DBをMySQLに変更する。
とりあえず
mysql.server start
しないと、mysql.sockがないとかで小一時間しかられた。
次にmysql -u root -pでパスワードを入力してmysqlに入る。
これはPCと同じ。
その後の内容はここ[http://www.oyabunn.com/wordpress/archives/60]を参照。
めっちゃ見やすくなった。
= Hirbでrails cを綺麗にする
まずgemをインストールする。
gem 'hirb'
gem 'hirb-unicode'
gem 'pry-doc'
そのあと、$home/.pryrc (~/.pryrcのこと)を新しく作成する。
そして以下を記述。
begin
require 'hirb'
rescue LoadError
# Missing goodies, bummer
end
if defined? Hirb
# Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
Hirb::View.instance_eval do
def enable_output_method
@output_method = true
@old_print = Pry.config.print
Pry.config.print = proc do |output, value|
Hirb::View.view_or_page_output(value) || @old_print.call(output, value)
end
end
def disable_output_method
Pry.config.print = @old_print
@output_method = nil
end
end
Hirb.enable
end
これでオッケーヾ(๑╹◡╹)ノ"
= サムネイルを綺麗に表示 & ヘッダー少し大きめ
そろそろhtmlやらなんやら綺麗にする。
home/_header.html.erbの項目を少し減らす。それでformやらなんやらも追加する。
Search
そのあと、bootstrapを読み込んだあとにapplication.cssを読み込むようにする。
*= require bootstrap
*= require_self
*= require_tree .
このようにapplication.cssの記述の順番を変更。そうすると最後に読み込まれるapplicaiton.cssの方が優先される。
cssはヘッダーの大きさやら背景やら、formの調整やらで次のようになった。
#header{
width:1024px;
margin-left: auto;
margin-right: auto;
padding:10px;
}
.wrapper{
margin-top:100px;
width:1024px;
margin-right:auto;
margin-left:auto;
}
.navbar-inner{
vertical-align: middle;
background : none;
background-color: white;
}
form.form-search#item{
padding: 5px;
margin: 0px;
}
button.btn#item-search {
margin-top: 0px;
}
次にapp/uploaders/image_uploader.rbを次のように書き換える
version :thumb do
process :resize_to_fill => [280, 120]
end
表示するviewを新たに作る。views/items/_thumb.html.erbを新たに作り、
パーシャルを呼び出すようにitems/index.html.erbも書き換える。
ここには_thumbの記述だけのこす。
-
<%= link_to image_tag(item.image_url(:thumb)), item %>
<% end %>
<% @items.each do |item| %>
最後に元々テーブルで表示していたindex.html.erbの記述を消去。
まだ改良の余地はある。