Rails在URL中把ID换成名称的方法

现有这样的URL:

http://0.0.0.0:3000/users/1

要变成这样的URL:

http://0.0.0.0:3000/users/jack

该怎么办呢?

==================== Let’s go! ====================

routes.rb

resources :users

在其控制器中加一个这样的方法:

def to_param

  “#{name}”

end

这样就重写了参数。此时查询数据时用 fing_by_name ,如

@users = User.find_by_name(params[:id])

在视图中:

<% @users.each do |user| %>

<%= link_to “详细”, user_path(user.name) %>

<%= link_to “编辑”, edit_user_path(user.name) %>

<%= link_to “删除”, user_path(user.name), confirm: “真的要删除吗?”, method: :delete %>

<% end %>

Advertisements

Ruby的Hash、Array和字符串处理小记

往Hash中添加元素

h = Hash.new

h[“a”] = “b”

p h  #=> { “a” => “b” }

Method 2:

h = Hash.new

h.store(“c”, “d”)

p h  #=> { “c” => “d” }

应用场景:

表单中有动态字段时,参数和数据库中动态匹配。

判断一个数组是否包含一个字符串

if %w[1 2 3].include?(“1”)  #=> true

判断一个变量是不是数组

if param.kind_of?(Array)  #=> true or false

字符串置换函数

a = “hello world”

b = a.gsub(“ ”, “,”)

p b  #=> hello,world

用Koala开发Facebook应用时获取安装到页面的ID

把自己开发的应用安装到Facebook页面后,如何自己记录下那个页面的ID信息呢?

参照这两个文档:

http://developers.facebook.com/docs/reference/dialogs/add_to_page/

https://developers.facebook.com/docs/appsonfacebook/pagetabs/

安装用这种方法:

https://www.facebook.com/dialog/pagetab?app_id=YOUR_APP_ID&display=popup&next=YOUR_URL

必须注意的是,这里的“YOUR_URL”一定与Facebook应用设置页面中页面标签处填写的一致,或者是那后面的扩展子域名。如:

http://0.0.0.0:3000/member/

要是把“YOUR_URL”设成这样就不行:

http://0.0.0.0:3000/apps/

为啥不行?错误如下:

API Error Code: 191

API Error Description: The specified URL is not owned by the application

Error Message: redirect_uri is not owned by the application.

这样在程序中添加一个接收返回值的方法:

def redirect

  params[:tabs_added].each do |key,value|

    @page_id = key  # Facebook Page ID

    redirect_to “http://www.facebook.com/#{key}”

  end

end

用 Koala 开发 Facebook App

开发 Facebook App,Koaka 是最靠谱的了吧:

https://github.com/arsduo/koala

它的 Wiki 很详细:

https://github.com/arsduo/koala/wiki

但要是从零开始用 Ruby on Rails 开发的话,可能会摸不着头脑。

以本人的经验,先在创建 Facebook 应用时选择用 Heroku 服务器托管,这样可以从 PHP、Python、Ruby、Node.js 四种语言中选现成的项目(即源码)。选择 Ruby 并用 Git 下载到本地看源码,你会发现很多公式的好写法:

https://github.com/heroku/facebook-template-ruby

======= 现在说下 Ruby on Rails 的必要部分吧 =======

1.总控制器

../app/controllers/application_controller.rb

def authenticator(app)

    case app

    when ‘APP_NAME’  # 这里是第4步设置的“your_app_name”

    @authenticator ||= Koala::Facebook::OAuth.new(Settings.facebook.member.app_id, Settings.facebook.member.app_secret,Settings.facebook.apps_url + “/#{app}/auth/callback”)

    else

    end

end

这样写的原因是我一个项目要开发多个APP,这样在子控制层中分别传APP名称参数到这里,形成通用。

2.子应用控制器

../app/controllers/member/auth_controller.rb

def index

  session[:access_token] = nil

  redirect_to authenticator(Settings.facebook.member.name).url_for_oauth_code(:permissions => Settings.facebook.member.permissions)

end

def callback

  session[:access_token] = authenticator(Settings.facebook.member.name).get_access_token(params[:code])

  redirect_to member_manage_index_path

end

这个子应用叫“member”。

3.认证完毕跳转控制器

../app/controllers/member/manage_controller.rb

def index 

  # Get base API Connection

  begin

    @graph = Koala::Facebook::API.new(session[:access_token])

    @app = @graph.get_object(Settings.facebook.member.app_id)

    if session[:access_token]

      @user = @graph.get_object(“me”)

    end

  rescue

  end

  # (业务处理)

end

4.全局参数设置

../config/settings.yml

  facebook:

    apps_url: http://apps.facebook.com

    member:

      app_id: your_app_id

      app_secret: your_app_secret

      name: your_app_name

      permissions: publish_stream

“settingslogic”的用法,参照:

https://github.com/binarylogic/settingslogic

5.Route设置

../config/routes.rb

namespace :member do

    root :to => “index#index”

    resources :auth do

      collection do

        get :index

        post :callback

      end

    end

    resources :manage do

      collection do

        get :index

      end

    end

    # (Other resources)

end

6.视图中链向认证

../app/views/member/index/index.html.erb

<%= link_to “管理画面”, member_auth_index_path, :target => “_blank” %>

7.一系列处理后在视图中确认

../app/views/member/manage/index.html.erb

APP:<a href=“<%= @app[’@app’] %>”><%= @app[‘name’] %></a>

User picture:<%= image_tag “https://graph.facebook.com/#{@user[‘id’]}/picture?type=normal” %>

User name:<%= @user[‘name’] %>

基本准备到此结束。

忘记 ssh keygen 密码时 heroku keys 的解决方案

生命在于折腾

前面说过《新环境连接Heroku的步骤》,第三步中设置的密码如果忘了怎么办?

你就重新生成keygen:

ssh-keygen -t rsa

再上传到Heroku试试:

heroku keys:add ~/.ssh/id_rsa.pub

结果执行 git push 发现不行:(

原因有二:

1.在heroku下已经有了。

执行命令看看有哪些:

heroku keys

这时删除已经添加的:

heroku keys:remove user@workstation.local

再次上传:

heroku keys:add ~/.ssh/id_rsa.pub

2.本地的 ssh 没识别

执行:

ssh-add

确认看到 “ Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa) ” 。

至此,恢复正常。