王筝的博客
ruby学习

(1)建表的时候注意保留字

在新建的表里无法插入一列的值, 报错信息是:Can’t mass-assign protected attributes,这一列的列名是type,查了一下发现是因为type是保留字引起的.

(2)查看端口

netstat  -natp

(3)在coffeescript里写方法

new_fun = ->

console.info “this is a function”

调用的时候

new_fun()

(4)include的用法很多

<%= [“aa”,”bb”].include? filter.order_by %>

(5)给text_field_tag设置宽度

<%= text_field_tag “area”, filter.area, :size => 5 %>

(6)select_tag

新建的时候

<%= select_tag ‘order_by’,options_for_select([‘最多播放’,
‘最近更新’])%>

index页面:

<%= select_tag ‘order_by’,options_for_select([‘最多播放’,
‘最近更新’], filter.order_by) %>

(7)安装一下解压软件

which unrar
which rar
sudo apt-get install unrar
unrar -h
ls -altrh
unrar x 上方轮播图.rar

 

(8)coffeescript里如果需要写尖括号,那么需要用三个引号引起来,就不用使用转义符号了.

<%####################### %>
551 form = $(“””<form></form>”””)
552 form.attr(‘action’,”/tv_i/filterlists”)
553 form.attr(‘method’,”post”) %>
554 input1 = $(“””<input type=”text” name=”channel” value=#{category} />”””)
555 input2 = $(“””<input type=”text” name=”area” value=#{area} />”””)
556 input3 = $(“””<input type=”text” name=”filter_type” value=#{type} />”””)
557 input4 = $(“””<input type=”text” name=”time” value=#{time} />”””)
558 input5 = $(“””<input type=”text” name=”status” value=#{status} />”””)
559 input6 = $(“””<input type=”text” name=”pay” value=#{pay} />”””)
560 input7 = $(“””<input type=”text” name=”order_by” value=#{order_by} />”””)
561 input8 = $(“””<input type=”text” name=”order_time” value=#{order_time} />”””)
562 form.append(input1)
563 form.append(input2)
564 form.append(input3)
565 form.append(input4)
566 form.append(input5)
567form.append(input6)
568 form.append(input7)
569 form.append(input8)
570 form.appendTo(“body”)
571 form.css(‘display’,’none’)
572 form.submit()

(9)

$(“.filter-content[name=channel]”).val(category)

对应的html代码

<%= form_for :filter, @filter, :url => {:action => ‘create’},
:html => {:multipart => :true, :name => “form1″, :id => “filter_form”} do |s| %>
<input type=”text” name=”channel” class=”filter-content”/>

<% end %>

以上是在大师和PP的指导 下完成的,非常感谢

1. 未雨绸缪:  先到 http://gforge.1verge.net/gf/ 申请一个新的项目m_cms_iphone。非常快就收到开通邮件了, 很开心,于是又申请了一个别的项目尝试下,刚申请完忙点别的事,回来发现又收到开通邮件了,简直是秒杀啊.

(这里有一点需要注意的是 选择代码管理方式为git,而不是svn ,这样等半个小时以后,代码下载地址就有效啦)
== 核心: 我们不是先新建 光秃秃的项目,再添加代码。
要做减法: 先COPY一个新项目,再砍掉没用的东东。
优点:
1. 马上就能跑起来。
2. 多余的东西,可以暂时隐藏掉。
3. 省时省力。

缺点:  会有一些冗余的代码。
===========

2. COPY代码到一个新的文件夹。

3. $ cp m-cms    m_cms_iphone -r

4. 删掉: views,  controllers. helpers, spec….

$ rm .git -rf
$ rm -rf .idea
$ rm .gitignore
$ rm .rspec
5. 但是: 记得保留: models!  (因为 )
6. 精简 routes.rb
7. 精简 左侧菜单。
8. 单元测试就可以跑起来了。
9. 修改 部署脚本。 (config/deploy.rb )
10. 把它push 到第一步申请的项目中去。

这里需要注意啦,过程是这样的,先找到gforge上面找到代码下载地址,把整个文件下载下来,随便放个临时的文件夹里就ok,之后把这个文件夹下面的 .git 拷贝到g刚才新建的项目文件夹里.

$git clone ssh://姓名@gforge.1verge.net:端口号/gitroot/m_cms_iphone

$cp .git/  ../m_cms_iphone/ -r

$ git add .

$git commit -m ‘initial’

$git pull

$git push –set-upstream origin master

 

11. 可以在wiki上建立对应的页面。

12. 修改服务器上nginx配置

server {
listen 5000;

location /iphone {
proxy_pass http://10.103.13.103:3660/iphone;
}
location /interface/iphone {
proxy_pass http://10.103.13.103:3660/interface/iphone;
}

}

server {
listen 80;

location /iphone {
proxy_pass http://10.103.13.103:3660/iphone;
}
location /interface/iphone{
proxy_pass http://10.103.13.103:3660/interface/iphone;
}

}

 

server {
listen 3660;

allow 10.0.0.0/8;
deny all;

charset utf-8;
location / {
proxy_pass http://iphone_servers;
proxy_redirect default;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
}

upstream iphone_servers{
server 127.0.0.1:6300;
server 127.0.0.1:6301;
}

最终访问的端口是6300和6301

发布过程中遇到了一点点小问题,报错内容是无法删除current文件夹,原因是current是一个软链接,我在服务器上手动建了个current,所以报错啦,在服务器上执行ll的时候可以看到,current  是 lrwxrwxrwx,releases是drwxrwxrwx,首字母一个是l,表示link,一个是  d ,表示directory

之前遇到过类似的问题,今天又有点糊涂了, 记录下.

问题是这样的,在view里写了一个按钮,点击之后发现controller里没有收到params,都是空值,

忘记把按钮放在form表单内部了,之前放在外面了,按钮里的参数注意下啊.

<% link_to “下载查询结果 “, selected_csv_client_pids_path(

:selected_business_type => params[:business_type]),

class => “btn btn-success”, :title => ‘aaa’  %>

这样controller里就能传了

type = params[:selected_business_type]

 

https://github.com/thoughtbot/factory_girl

https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

http://ruby.taobao.org/

今天项目结束,打算搞一下接手这个项目之前的单元测试,因为接受的时候很多测试是跑不通的,于是重新学习了一下 factory_girl

gem install factory_girl (半天没响应)

由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败。所以你会与遇到 gem install rack 或 bundle install 的时候半天没有响应,具体可以用 gem install rails -V 来查看执行过程。现在来更换一下gem source

$ gem sources --remove https://rubygems.org/
$ gem sources -a http://ruby.taobao.org/
$ gem sources -l
*** CURRENT SOURCES ***

http://ruby.taobao.org

# 请确保只有 ruby.taobao.org

Configure your test suite

# rspec
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

# Test::Unit
class Test::Unit::TestCase
  include FactoryGirl::Syntax::Methods
end

# Cucumber
World(FactoryGirl::Syntax::Methods)

# Spinach
class Spinach::FeatureSteps
  include FactoryGirl::Syntax::Methods
end

# MiniTest
class MiniTest::Unit::TestCase
  include FactoryGirl::Syntax::Methods
end

# MiniTest::Spec
class MiniTest::Spec
  include FactoryGirl::Syntax::Methods
end

# minitest-rails
class MiniTest::Rails::ActiveSupport::TestCase
  include FactoryGirl::Syntax::Methods
end

由于我们用的是rspec,所以选第一种,所在spec/spec_helper.rb里配置第18行那句

1 # -*- encoding : utf-8 -*-
2 # This file is copied to spec/ when you run ‘rails generate rspec:install’
3 ENV[“RAILS_ENV”] ||= ‘test’
4 require File.expand_path(“../../config/environment”, __FILE__)
5 require ‘rspec/rails’
6 require ‘rspec/autorun’
7 require “email_spec”
8
9 # Requires supporting ruby files with custom matchers and macros, etc,
10 # in spec/support/ and its subdirectories.
11 Dir[Rails.root.join(“spec/support/**/*.rb”)].each {|f| require f}
12 Dir[Rails.root.join(“lib/mock*.rb”)].each {|f| require f}
13
14 RSpec.configure do |config|
15 config.fixture_path = “#{::Rails.root}/spec/fixtures”
16 config.use_transactional_fixtures = true
17 config.infer_base_class_for_anonymous_controllers = false
18 config.include FactoryGirl::Syntax::Methods
19 config.global_fixtures = :all
20 config.include(EmailSpec::Helpers)
21 config.include(EmailSpec::Matchers)
22 end

 

Defining factories

# This will guess the User class
FactoryGirl.define do
  factory :user do
    first_name "John"
    last_name  "Doe"
    admin false
  end

  # This will use the User class (Admin would have been guessed)
  factory :admin, class: User do
    first_name "Admin"
    last_name  "User"
    admin      true
  end
end

一般在factories的文件夹,以modle名字来命名factory,这样更清晰

来看看我写的这段

FactoryGirl.define do
factory :cms_tv_version do
title “2.0.0”
state 1
end
end



 

 

如何将一段代码从对象中取出并将它像对象一样传递。在ruby中,一个Proc是一个包含一段代码的对象。创建Proc的最常用的方法是使用Lambda方法。

irb(main):031:0> hello = lambda do
irb(main):032:1* puts ‘hello’
irb(main):033:1> puts ‘i am’
irb(main):034:1> end
=> #<Proc:0x00000001abb250@(irb):31 (lambda)>
irb(main):035:0> hello.call
hello
i am
=> nil

 

ruby 将位于do和 end之间的那部分代码称为代码块。Lambda方法返回一个新的Proc对象,这个对象是do和end之间代码的容器,我们的hello变量指向Proc对象。

在大师的指导下配置了新的服务器的nginx,通过top命令查看了服务器是8个cpu的,所以起了8个端口,把它们都映射到一个总的端口3600上,需要在做如下配置。1. nginx 中做如下配置:

server {
         listen 3600;
         charset utf-8;
         location / {
             proxy_pass          http://aaa_servers;
             proxy_redirect      default;
             proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header    X-Real-IP $remote_addr;
             proxy_set_header    Host $http_host;
             proxy_next_upstream http_502 http_504 error timeout invalid_header;
        }
     }
     upstream aaa_servers{
            server 127.0.0.1:3201;
            server 127.0.0.1:3202;
            server 127.0.0.1:3203;
            server 127.0.0.1:3204;
            server 127.0.0.1:3205;
            server 127.0.0.1:3206;
            server 127.0.0.1:3207;
            server 127.0.0.1:3208;}

重启 nginx:

  $ nginx -t  (测试一下配置文件)
  $ nginx -s reload

2. 使用 配置文件来启动 thin:

2.1. 建立 /config/thin.yml , 内容如下:

---
chdir: '/opt/app/ruby/mmm/current  #  这里需要修改。
environment: production
address: 0.0.0.0
port: 3201   (这是第一个端口的端口号码)
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []
wait: 30
servers: 8     (这里确定启动几个端口)
daemonize: true

2.2. 启动thin: (记得Gemfile 中要有 gem ‘thin’ )

    $ bundle exec thin restart -C config/thin.yml

2.3. 在 config/environments/production.rb文件中: (以后可以使用nginx来 配置,处理静态文件)

Cms::Application.configure do
    config.serve_static_assets = true
end

就可以了。

大约30年前,当美国人边开着大型轿车边享受着其他国家民众的羡慕目光时,
大众汽车却在美国开展了一项主题为“小即是美”的广告营销活动。
那时,美国人对大轿车的迷恋世人皆知,这家德国汽车制造厂商的举动似乎有些不合时宜。
然后意想不到的事情发生了,石油价格的上升及经济状况的制约,这些昔日的可笑小车
变成了时髦的必需品。

这带来了Unix哲学的第一条准则。

准则一:小即是美

如果你准备开始编写一个程序,请从小规模开始并尽量保持,无论是设计简单的过滤器、
图形软件包还是庞大的数据库,你应该尽自己所能将它的规模将至最小。

准则二:让每个程序只做好一件事

最好的程序应该将全部能量只用来执行单一任务,并且将它完成的很好。
程序被加载到内存中,行使完它的功能,然后退出,让下一个目标单一的程序开始运行。

准则三:尽快建立原型

“尽快”就是越快越好,火速进行。可以先花少量时间规划这个应用程序,然后便可以创建原型。
开始编写代码吧,就好像你的生命完全取决于这个原型一样。
建立早期原型能够降低风险,越早开始建立原型,就离可发布产品的状态越近。原型可以显示哪些想法可行,最重要的是,
哪些是不可行的。

准则四:

舍高效率而取可移植性

软件开发过程涉及无数选择,每个选择都意味着各种妥协。其中,程序员要面对的一个艰难的选择就是:高效率与可移植性。
高效率的软件非常有吸引力,然而,可移植性意味着软件能够运行在许多不同的机器上,这使得人们考量的天平向可移植性这一端倾斜。
这其中资金层面的因素要大于技术层面:在今天的计算环境中,那些只能运行在一种体系架构上的软件,其潜在市场竞争力会大打折扣。

准则五:采用纯文本文件来存储数据

“纯文本文件”的意思是你必须将所有数据都存储为文本,用Unix世界的行话来说,数据文件应该只包括一组由换行符或“newline”
分割的字节流。尽管我们可以将数据保存在任何存储介质上,但是想让数据保持活力并拥有价值,
就必须时不时的移动。文本是通用的可转换格式,文本文件易于阅读和编辑。

准则六:充分利用软件的杠杆效应

无论你有多么聪明过人、精力充沛或者锐意进取,在人生的漫漫长途中,一个人的精力就只有这么多。如果想取得非凡的成就,
你就必须放大自己对这个世界的影响力。想编写大量软件,最好的方法就是借用别人的成果。良好的程序员编写优秀代码,
优秀的程序员借用优秀代码。允许他人使用你的代码来发挥软件的杠杆效应。

准则七:使用shell脚本来提高杠杆效应和可移植性

如果你想充分利用软件的杠杆效应,就需要学习如何有效使用shell脚本。shell脚本由一个或者多个语句组成,通过调用本地程序、
解释程序和其他shell脚本来执行任务。他们将每一条命令都加载到内存执行,并且间接调用这些程序。顶级shell程序根据语句的种类,
可以选择是否要等待带个命令完成它的执行任务。如果想营造一种他人播种,你来收货的局面。shell脚本就提供了这样的机会,
它能够集成他人的努力成果以满足自己的目标。你不需要重复编写shell脚本中使用的大部分代码,因为别人早已帮你完成了这份工作。

准则8:避免强制的用户界面CUI

CUI是一种与应用程序进行交互的模式,它位于系统最高命令解释器之上。一旦你在命令解释器中调用了一个应用程序,
那么直到应用程序退出之前,都无法再与命令解释器进行交互。CUI命令解释器的规模庞大且难以编写。拥有CUI的程序
难以与其他项目相结合,没有良好的扩展性,并且无法利用软件的杠杆效应。

准则九:让每个程序都成为过滤器

自有计算技术以来,人们编写的每一个程序都是一个过滤器。每个程序,不管它简单还是复杂,都以某种形式接受数据作为它的输入,
并产生一些数据作为输出。至于程序过滤器如何处理提交给它的数据,则要看程序的算法。程序不创建数据,只有人类才创建数据。