Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/timakin/apper

apper
https://github.com/timakin/apper

Last synced: about 1 month ago
JSON representation

apper

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]
end

version :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()
end

indexならこんな感じ

= 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
end

def 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 %>

<%= f.submit "Search" %>

<% 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.label :name %>

<%= 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の記述だけのこす。


        <% @items.each do |item| %>


    • <%= link_to image_tag(item.image_url(:thumb)), item %>

      <%= item.user.name %>

      <%= link_to item.title, item %>


      <%= item.text %>



      Action
      Action




      <% end %>

    最後に元々テーブルで表示していたindex.html.erbの記述を消去。
    まだ改良の余地はある。