0%

##多对多关联:
在Rails中多对多关联通过在关联表对应的类中声明has_and_belongs_to_many来实现。
在数据库中,多对多关联使用中间表来实现,表中包括关联表的主键,Active Record假定这个中间表的名字是由关联表的名字根据字母的顺序串联起来得到的。

Weiterlesen »

##调用淘宝IP的API,Helper:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module AdminsHelper
require 'open-uri'
require 'json'
def hello_world(name)
"hello #{name}"
end
def get_location
ip = request.remote_ip
url = "http://ip.taobao.com/service/getIpInfo.php?ip=" + ip
response = Net::HTTP.get_response(URI.parse(url)).body
response = JSON.parse(response)['data']
end
def get_country
response = get_location['country']
end
end
Weiterlesen »

http://railscasts.com/episodes/138-i18n
http://rails-i18n.org/
Locale Examples
http://blog.segmentfault.com/xiongxin/1190000000489534

###i18n.rb:

1
2
3
4
5
I18n.default_locale = 'zh-CN'
LANGUAGES = {
'English' => 'en',
'Chinese' => 'zh-CN'
}

###application.rb:

1
2
3
I18n.config.enforce_available_locales = false
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :'zh-CN'

kaminari 多语设置

###zh-CN.yml:

1
2
3
4
5
6
7
8
zh-CN:
views:
pagination:
first: "« 首页"
last: "末页 »"
previous: "« 上一页"
next: "下一页 »"
truncate: "..."

##全局参数设置
执行以下命令,会在config/initializers下生成一个配置文件kaminari_config.rb

1
rails g kaminari:config

这个文件控制着kaminari的全局设置,有以下参数可以定义
default_per_page 默认值25
page_method_name 分页方法的名称
param_name 分页参数的参数名,默认为param
window / outer_window / left / right这四个参数都与分页显示有关,设定了显示页码标签的方式和数量。

##分页界面定制
执行一下命令可以获取默认模版文件。目录在app/views/kaminari/下

1
rails g kaminari:views default

各个文件描述如下
_paginator.html.erb 这是总的入口文件,可以通过修改它来调整显示的整体结构比如我不需要”首页”,”末页”这两个链接,那么我就在这个文件里面将对应的代码删除
_page.html.erb 对应页码链接
_first_page.html.erb / _last_page.html.erb对应”首页”和”末页”的链接
_prev_page.html.erb / _next_page.html.erb 对应”上一页”和”下一页”的链接
_gap.html.erb 空隙的显示,默认是中间的省略号(…)

注意,不要修改文件名。

theme功能
app/views/kaminari目录下创建一个文件夹,例如test,把默认的模版文件拷贝进去,修改模版文件的内容,就形成了个性化的样式。
view页面按下方写法即可调用个性样式。

1
<%= paginate @blogs, :theme=>'test' %>

野三坡

##常用命令

1
2
3
rake db:schema:dump
rails g model 名称
rails g controller 名称

##常用gem:

1
2
3
gem 'mysql2'
gem 'kaminari' #分页
gem 'nokogiri' #DOM分析
Weiterlesen »

###Function is_bot():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public function is_bot()
{
$data['robotspage'] = $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : '';
$data['oldurl'] = $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : '直接访问';
import('ORG.Net.IpLocation'); // 导入IpLocation类
$Ip = new IpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
$data['robotsip'] = get_client_ip();
$useragent = addslashes(strtolower($_SERVER['HTTP_USER_AGENT']));
if (strpos($useragent, 'googlebot') !== false) {
$bot = 'Google';
} elseif (strpos($useragent, 'mediapartners-google') !== false) {
$bot = 'Google Adsense';
} elseif (strpos($useragent, 'baiduspider') !== false) {
$bot = 'Baidu';
} elseif (strpos($useragent, 'sogou spider') !== false) {
$bot = 'Sogou';
} elseif (strpos($useragent, 'sogou web') !== false) {
$bot = 'Sogou web';
} elseif (strpos($useragent, 'sosospider') !== false) {
$bot = 'SOSO';
} elseif (strpos($useragent, 'yahoo') !== false) {
$bot = 'Yahoo';
} elseif (strpos($useragent, 'msn') !== false) {
$bot = 'MSN';
} elseif (strpos($useragent, 'msnbot') !== false) {
$bot = 'msnbot';
} elseif (strpos($useragent, 'sohu') !== false) {
$bot = 'Sohu';
} elseif (strpos($useragent, 'yodaoBot') !== false) {
$bot = 'Yodao';
} elseif (strpos($useragent, 'twiceler') !== false) {
$bot = 'Twiceler';
} elseif (strpos($useragent, 'ia_archiver') !== false) {
$bot = 'Alexa_';
} elseif (strpos($useragent, 'iaarchiver') !== false) {
$bot = 'Alexa';
} elseif (strpos($useragent, 'slurp') !== false) {
$bot = '雅虎';
} elseif (strpos($useragent, 'bot') !== false) {
$bot = '未知'.$useragent;
}
$data['robotsname'] = $bot;
$data['robotsarea'] = serialize($Ip->getlocation($data['robotsip']));
$data['create_time'] = time();
if (isset($bot)) //如果是蜘蛛就存到数据库
{
//$Jrobot->create();非表单无隐藏域,无法使用create()方法
$Jrobot = D("Robot");
$lastInsId = $Jrobot->add($data);
}