• #12 楼 @zhangyuxiu 那啥,趁你还没花多少时间进去,赶紧把发行版换掉……不要用 Fedora……

    Fedora用户完全被RedHat当成小白鼠

  • #10 楼 @zhangyuxiu 没事别 sudo

  • #6 楼 @xhj6 其实只增加了一个 create_or_use_list 方法……controller 里面的其实不算增加的,rails4 里面用 strong_parameters 必须一个个自己手动写 permit……所以我才想要 ❨╯°□°❩╯︵ ┻━┻ 其实自己重定义lists_attributes=方法也是可以的,好像更简单一些

  • 我觉得这样就可以了(。・ω・。)

    class Order
      def ❨╯°□°❩╯︵(┻━┻)
        create_or_use_list ┻━┻
      end
      def self.(\—_—)\(params)
        self.new(params)
      end
    
      private
    
      def create_or_use_list(list_params)
        # logic goes here
      end
    end
    
    
    class OrdersController < ApplicationController
    
      def create
        @order = Order.(\—_—)\ ┯━┯
    
        if @order.❨╯°□°❩╯︵ ┻━┻
          flash[:notice] = t('common.update_success')
        end
        respond_with @order
      end
    
      def ┯━┯
        params.require(:order).permit(:name, order: [:name, :number, :about])
      end
    
      def ┻━┻
        ┯━┯.delete :order
      end
    end
    
  • 用 calibre 什么的随便转下格式就行了

  • 直接看他的 vimrc 就行了: https://github.com/knwang/dotfiles/blob/master/.vimrc

  • #10 楼 @cod7ce 这种需求直接关显示器锁成黑屏得了,开着显示器即消耗使用寿命又废电不够环保……

  • High performance Rails at 2013年06月03日

    #18 楼 @quakewang json 确实不大,于是刚刚试着让 json 长度变大,将 index 里面 per_page 从 8 增加到 25,差距反而更大了……

    8 Time per request: 115.210 [ms] vs 148.235 [ms] 25 Time per request: 150.185 [ms] vs 212.686 [ms]

    cache 是用的 redis:

    config.cache_store = :redis_store, "redis://localhost:6379/0/cache", { expires_in: 90.minutes }
    
  • High performance Rails at 2013年06月03日

    顺便吐槽下新版的 nginx,内置了 etag 然后强制隐藏了上游 etag,没法用 rails 里面的 etag 了……

    add_header ETag $upstream_http_etag;

    都没用……

  • High performance Rails at 2013年06月03日

    好奇怪啊,我试了下在 json 里面用 cache digest,然后用 ab 测试,响应时间反而显著变慢了……是不是也就是说如果生成的 json 不大,就根本没必要 cache 么……

    json.cache! @users do |json|
      json.users @users do |user|
        json.id         user.id
        json.user_name  user.user_name
        ...
      end
    end
    
    Concurrency Level:      100
    Time taken for tests:   7.412 seconds
    Complete requests:      5000
    Failed requests:        0
    Write errors:           0
    Total transferred:      6368120 bytes
    HTML transferred:       4215000 bytes
    Requests per second:    674.61 [#/sec] (mean)
    Time per request:       148.235 [ms] (mean)
    Time per request:       1.482 [ms] (mean, across all concurrent requests)
    Transfer rate:          839.06 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.5      0       5
    Processing:    12  146  31.5    144     417
    Waiting:       12  146  31.5    144     417
    Total:         17  146  31.4    144     417
    
    Percentage of the requests served within a certain time (ms)
      50%    144
      66%    152
      75%    158
      80%    161
      90%    170
      95%    184
      98%    232
      99%    291
     100%    417 (longest request)
    
    

    vs

    json.users @users do |user|
      json.id         user.id
      json.user_name  user.user_name
      ...
    end
    
    Concurrency Level:      100
    Time taken for tests:   5.761 seconds
    Complete requests:      5000
    Failed requests:        0
    Write errors:           0
    Total transferred:      6368028 bytes
    HTML transferred:       4215000 bytes
    Requests per second:    867.98 [#/sec] (mean)
    Time per request:       115.210 [ms] (mean)
    Time per request:       1.152 [ms] (mean, across all concurrent requests)
    Transfer rate:          1079.55 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.6      0       6
    Processing:    18  113  27.5    109     407
    Waiting:       18  113  27.5    109     407
    Total:         23  113  27.4    109     407
    
    Percentage of the requests served within a certain time (ms)
      50%    109
      66%    118
      75%    125
      80%    129
      90%    137
      95%    145
      98%    166
      99%    243
     100%    407 (longest request)
    
  • #35 楼 @chenge 其实还有个类似的 firebase,官方有提供 ng 的 service 据说是实时的

  • #31 楼 @ronbin 那个 required 应该是 simple_form 加的,我都没动它…… 其实那 helper 没干啥特别的,只是用 simple_form 的 custom form builder 的功能,直接将后端模型塞入到相应的options[:input_html]['data-ng-model']里面而已,写的很难看很罗嗦,但整个全部不到 50 行,所以真的是很简单的……那个 data-ng-disable 只是简单的覆盖掉 form builder 原来的 button……

    def button(name, options={})
      options[:class] ||= ''
      options[:class] += ' btn'
      options[:class].sub!(/^\s+/, '')
    
      content_tag(:div, name, options.merge(
        'data-ng-click' => 'submit()',
        'data-ng-disabled' => 'form.$invalid'
      ))
    end
    
  • #16 楼 @nightire So, what's your point then? You are now useing some pure front-ended helper which is written in javascript that are better than Rails helper which is written in ruby? Ok, If you have something better, just show us the code, please.

    PS.说了半天你怎么知道我就没看过那点东西呢?我会告诉你我最后选 angular 没选 ember 的原因之一就是看了 discourse 那些一坨坨的玩意被吓到了么……

  • #11 楼 @nightire 哟,满满的优越感……随便一个语法简答的模板引擎就能满足你了?非要我把生成的 html 帖出来比较么 源码:

    = ng_form_for(User.new, controller: 'RegistrationNewCtrl') do |f|
        = f.input :user_name, placeholder: '输入你的用户名'
        = f.input :email, placeholder: '[email protected]'
        = f.input :password, placeholder: '长度在6位以上'
        = f.input :password_confirmation, placeholder: '确认密码'
        = f.button '注册'
    
    <form accept-charset="UTF-8" action="/users" class="simple_form new_user" data-ng-controller="RegistrationNewCtrl" data-ng-submit="submit()" id="new_user" method="post" name="form" novalidate="novalidate">
        <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" />
        </div>
        <div class="control-group string required user_user_name"><label class="string required control-label" for="user_user_name"><abbr title="required">*</abbr>
                用户名</label>
            <div class="controls"><input class="string required" data-ng-model="user.user_name" id="user_user_name" name="user[user_name]" placeholder="输入你的用户名" type="text" />
                <p class="help-block">{{errors.user_name}}</p>
            </div>
        </div>
        <div class="control-group email optional user_email"><label class="email optional control-label" for="user_email">Email</label>
            <div class="controls"><input class="string email optional" data-ng-model="user.email" id="user_email" name="user[email]" placeholder="[email protected]" type="email" value="" />
                <p class="help-block">{{errors.email}}</p>
            </div>
        </div>
        <div class="control-group password optional user_password"><label class="password optional control-label" for="user_password">密码</label>
            <div class="controls"><input class="password optional" data-ng-model="user.password" id="user_password" name="user[password]" placeholder="长度在6位以上" type="password" />
                <p class="help-block">{{errors.password}}</p>
            </div>
        </div>
        <div class="control-group password optional user_password_confirmation"><label class="password optional control-label" for="user_password_confirmation">确认密码</label>
            <div class="controls"><input class="password optional" data-ng-model="user.password_confirmation" id="user_password_confirmation" name="user[password_confirmation]" placeholder="确认密码" type="password" />
                <p class="help-block">{{errors.password_confirmation}}</p>
            </div>
        </div>
        <div class="btn" data-ng-click="submit()" data-ng-disabled="form.$invalid">注册</div>
    </form>
    

    这玩意在我写完ng_form_for这 helper 之前,本来就是用 slim 手写的,重复得都想吐,同学你可以试着用 Emblem 重写一遍

  • #7 楼 @nightire 像这样三行东西我不觉得纯前端写起来会很方便:

    = ng_form_for User.new do |f|
      = f.input :name
      = f.input :email
      = f.button :submit
    
  • 就算是完全用 angular 写,你也还得写 template 啊,那么 rails 的 view 还是要的,毕竟手写 html 什么的太特么反人类了……另外不用 assets 难道不用 css 么

  • AngularJS 怎么用 jQuery at 2013年05月31日

    #12 楼 @metal 我觉得 angular 更贴近后端吧……一般都不用去管 dom 只管把模型弄好就成了,html 要啥直接写,没事老$(query) 才更反人类吧……

  • AngularJS 怎么用 jQuery at 2013年05月31日

    #8 楼 @metal 你还不如讲清楚要取得这个$('.entry').size()是用来干嘛的吧,在这里和直接products.length什么的有啥不同么……干嘛还要绕个圈从 dom 里面取

  • #18 楼 @kgen wow 国服好像没 mac 版吧?虽然 linux 一样能跑 win 版……

  • 对 stub 和 mock 的理解 at 2013年05月30日

    #14 楼 @fsword 集成测试本来就要写的啊,难道不写集成测试只在单元测试里面混作一团系统就没问题么……混作一团维护起来成本也不低额……

  • Rspec 101 at 2013年05月30日

    为啥用 goagent 和 ssh 都翻不开……

  • #17 楼 @reus 那把 access_log off 去掉呗,反正不应该让 rails 来处理

  • #23 楼 @zuozuo 这有啥,意识到不足才能有进步吧

  • #15 楼 @reus 其实直接在 nginx 里面禁掉好了…… Sending them into the rails server doesn't even make any sense

    location ~ ^/.*\.(php|php5)$ {
    deny all;
    access_log off;
    } 
    
  • AngularJS 怎么用 jQuery at 2013年05月28日

    首先,用 angularjs 最好别用 jquery,这是坏习惯,要改 Don't even use jQuery 然后谁告诉你

    AngularJS 这些东西不管数据是不是加载完成,都会第一时间显示页面

    去查查 resolve 还有 $q怎么用……

  • 难道你的意思是想要

    fields.delete("created_at")
    field :created_on, as: :created_at
    

    看不懂这样改个名字有啥优势……

  • #11 楼 @knwang 嗯……主要是语义上,用 describe 总是喜欢写成长长的整句,用 context 就几个单词搞定……

    然后,javascript 的测试怎么搞…… Jasmine 写起来感觉非常蛋疼,但是不写测试的话……rake stats 一看吓一跳,项目中差不多有一半是 coffeescript……

  • 其实我个人超讨厌 describe,比较喜欢写这样的:

    describe User do
    
      valid_addresses = %w[[email protected] [email protected] [email protected]]
      invalid_addresses = ['user@foo,com', 'user_at_foo.org', 'first.last@foo.', '']
    
      let(:user) { create :user }
    
      subject { user }
    
      context 'DB Implementation' do
        let(:user) { create :user }
    
        it { should have_field(:user_name).of_type(String) }
        it { should have_field(:email).of_type(String)
             .with_default_value_of('') }
        it { should have_field(:encrypted_password)
             .of_type(String).with_default_value_of('') }
    
        it { should have_many(:notifications) }
        it { should have_many(:photos) }
        it { should have_one(:profile) }
    
        it { should validate_presence_of(:user_name) }
        it { should validate_presence_of(:email) }
        it { should validate_uniqueness_of(:user_name) }
        it { should validate_uniqueness_of(:email) }
        it { should validate_confirmation_of(:password)}
    
        valid_addresses.each do |valid_address|
          it { should validate_format_of(:email).to_allow(valid_address) }
        end
    
        invalid_addresses.each do |invalid_address|
          it { should validate_format_of(:email).not_to_allow(invalid_address) }
        end
      end
    
      its(:admin?) { should be_false}
      context 'Admin' do
        let(:user) { create :admin }
        its(:admin?) { should be_true }
      end
    
      describe 'email' do
        context 'when set without token' do
          before { user.email = '[email protected]'; user.save! }
          its(:email) { should_not == '[email protected]' }
        end
      end
    
    end
    
  • #15 楼 @Rei VMware Player is free for personal use 个人用本来就是免费的吧,又没拿它来转卖,又不是用来搭建服务器什么的……硬要说的话,里面装的 windows 才有授权问题,我反正是没买,黑屏就黑屏,要不是偶尔要瞄一眼 IE 下的效果干脆就连虚拟机都免了,还能省几十 G 硬盘空间……

  • #11 楼 @as181920 除非要看 IE 下的效果,不然一般都没必要开虚拟机……另外用 vbox 还不如用 vmware player,性能好太多……