• 11 Skitch 12 Textmate 倒数 1 wunderlist 倒数 2 twitter

  • 如何将 Slim 文件转换回 erb at 2013年08月28日

    其实我看到强制缩进就绕道了…

  • #16 楼 @luikore 带显示屏?不是接电脑用的么?在显示器上就能看到把

  • #14 楼 @luikore thx,去搜搜看买不买得起...

  • #8 楼 @luikore ugee 哪个型号好?

  • #11 楼 @luikore 看看作品..

  • #3 楼 @luikore #4 楼 @aptx4869

    啊,原来 git 还可以这样用,TIL 了

  • bselect打法 这是什么?求教

  • #5 楼 @kenshin54 #6 楼 @luikore

    谢谢,这个 task 是根据 agent 的参数写 whenever 的 schedule 文件,然后 update crontab ...

  • #1 楼 @luikore 话说我在 config/environment.rb 里面加了一行 Agent::Application.load_tasks 就能调用了。你觉得这是可以接受的 practice 不...

  • #1 楼 @luikore 额,那就是说那个 Rake::Task#invoke 其实只是用在 rake task 里 call 另外一个 rake task 用的么...

  • 刚发现是 windows ... 爱莫能助,换个先进点的操作系统就好了

  • #2 楼 @wgf4242

    bundle exec guard
    
  • 多学个语言没啥不好,python 的用途比 ruby 广泛些,很多地方都能用到。

  • 程序员不易找对象的原因 at 2013年08月27日

    伪命题

  • 顶八楼,finder 和 iTunes 是真的烂…

  • 不错啊。要知道设计风格都是一段时间轮回的

  • :thumbsup:

  • 我该何去何从? at 2013年08月26日

    #7 楼 @542307299 你找过么?你只是听说过吧

  • 我该何去何从? at 2013年08月26日

    现在这社会,没房那里能娶得到媳妇呢,所以等不到那时候了。

    别的不清楚... 娶媳妇最好能娶个没房也愿意嫁的。等你买房了这点就看不出来了,所以没房是优势。

  • Ruby 是函数式语言吗? at 2013年08月26日

    #3 楼 @zlx_star Lisp is math, math 进步了多少 Lisp 就进步了多少

  • 文章评论添加的问题 at 2013年08月26日

    #26 楼 @runup 文档并没有覆盖所有的情况,遇到问题需要从原理上去分析。

    首先要搞清楚这个 Comment#create action 到底是做了什么。

    class CommentsController < ApplicationController
      def create
      @user = User.find(current_user)
      @two = @user.twos.find(params[:two_id])
    
      @comment = @two.comments.build(params[:comment])  # 主要起作用的代码行
      @comment.user = @user
      @comment.save
      redirect_to root_path
      end
    end
    

    就以这段代码为例吧,除了把 @user @two 找出来,保存 @comment ,重定向等语句,最重要的一句,也就是真正创建那一条 @comment 的代码是

    @comment = @two.comments.build(params[:comment]) 
    

    那么,如果现在是要手工建立一条 @comment ,而不是在网页上提交建立的话,在 console 里面应该这样写:

    @comment = @two.comments.build(:comment => "评论内容", :user => @user)
    

    @comment 里面有三个 attribute, :comment:user_id 由后面括号里面的参数提供,:two_id 由赋值等号右侧的 @two 提供,这样一来,三个 attribute 齐全,一条 @comment 就建立起来了。

    对比以上两行代码,你会发现,前面的都一样,就是括号里面的参数写法不同,一个是 params[:comment] ,另一个是 :comment => "评论内容", :user => @user

    但是这两行都能建立一条 @comment ,说明至少它们应该有相同的,至少是类似的格式,否则 #build 方法不认的。所以 params[:comment] 本身必须是个类似下面一行括号里面的 hash。

    现在就得看看这个 params 到底是什么玩意儿了,我觉得楼主应该是卡在这里。

    params 是 parameters (参数) 的缩写,在 Rails 里面,传进一个 controller action 的 params 有以下来源:

    1. Rails 约定的参数,有 params[:controller]params[:action] 等,这个先不用管。

    2. 从路由来的参数,比方你有定义 match '/user/:id' 这路由的话,访问这路径的时候就会有一个 params[:id] 的参数,值就是你实际访问的 user 的 user_id 值。

    3. 从浏览器地址栏来的参数,也就是 GET 请求传给 Rails app 的参数,比方说你在浏览器地址栏输入 http://127.0.0.1/users?user_id=15 ,这就是向 Rails app 发了一个 GET 请求 ( 实际上是向 app server 发的,不过暂时不用管这个 ) ,这个 GET 请求包含了一个 params,就是 url 里面 ? 后面的那一部分,在 controller 里面可以用 params[:user_id] 访问这个参数,这个参数的值是 "15" ( string ) 。

    4. 从网页的表单来的参数,也就是 POST 请求传给 Rails app 的参数。主要跟楼主讲讲这一点。

    要引发 Comment#create 方法,就要提交 app/view/twos/show.html.erb 里面的表单,发一个 POST 请求。我们看看这个表单的内容。

    <%= form_for(@comment) do |f| %>
    
      <div class="field">
        <%= f.label :评论 %><br />
        <%= f.text_field :comment %>
      </div>
      <%= hidden_field_tag(:two_id, @two.id) %>     <!-- 这行是后加的 -->
    
      <div class="actions">
        <%= f.submit  :提交%>
      </div>
    <% end %>
    

    首先 form_for(@comment) 这定义了一个 params[:comment] 的参数,可以在接收这个表单的 action method 里面访问 ( 这个例子里面接受这个表单的 method 当然就是 Comment#create ) ,这是 Rails 的约定。

    然后 do |f| 就是说,底下出现的 f 就代表这个参数了,这个 f 不一定是 f ,你用什么字符串都行,只要后面的一致就好。

    再往下看, f.label 只是显示标签,不管它;下面这行 f.text_field :comment 才是有用的部分,它在网页上显示一个 text_field 也就是一个输入框,按下提交的时候,这个输入框里的内容就会跟 :comment 联系起来。怎么联系呢?上面说过 f 代表 params[:comment] 这个参数,那么 f[:comment] 表示的就是 params[:comment][:comment] 。第一个 :comment 对应 要创建的 @comment ,第二个 :comment 对应这个 @comment 里面的 comment attribute . ( 这只能怪你名字没起好了... )

    那么现在,如果把我后面加的那行蒙住不看,继续往下看,没有别的值了,直接就是提交了。也就是说这个表单提交上去的内容是什么呢?

    如上面所说的,提交的是一个由 form_for(@comment) 定义的 params[:comment] 参数,这个参数是一个 hash ( Rails 的约定 ) ,如果我们假设用户在 f.text_field :comment 这个输入框里面填的是 foobar 的话,这个 hash 的值就是这样的:

    params[:comment] => { :comment => "foobar" }
    

    看到了吧,要取出 "foobar" 这个值,就要访问 params[:comment][:comment]

    回头看 Comment#create 里面的创建 @comment 的那句关键指令:

    @comment = @two.comments.build(params[:comment]) 
    

    现在我们知道 params[:comment] 是什么了,把它代入上面那行,得到:

    @comment = @two.comments.build(:comment => "foobar") 
    

    看到问题了没有,@comment 只有两个 attribute 得到了参数,:comment 得到了 "foobar":two_id 从前面的 @two 那里得到了 id 号,但是 :user_id 是没有的。

    同样道理:

    @comment = @user.comments.build(params[:comment])
    

    这句有 :user_id 了,但是缺了 :two_id

    至于为什么我在 app/view/twos/show.html.erb 里面加了一行,在 Comment#create 里面稍作改动,就能凑齐三个 attribute 了呢?就留给楼主自己思考吧。

    注意一点细节: hidden_field_tag 前面没有 f. 所以指代的参数是 params[:two_id] 而不是 params[:comment][:two_id]

  • Dash 一直是免费了么? at 2013年08月25日

    一直免费,有内购

  • Ruby 是函数式语言吗? at 2013年08月25日

    我觉得吧函数式是一种编程风格,并不是说某种语言是面向对象就不能是函数式,用什么语言都可以写出函数式风格来,区分「函数式语言」主要是看这语言设计的时候是否倾向于让用户使用 FP . Ruby 以其灵活性完全可以写出 FP 风格的代码来,但是无论 Ruby 社区的倾向还是 实际使用的便利程度,Ruby 都很难归入函数式语言里面...

  • #2 楼 @gefangshuai

    一般大侠们都有自己的博客吧

  • #10 楼 @mobiwolf 其实吧,主要是我对百度有严重的个人偏见,所以我的意见没什么价值啦。

  • 直接发成帖子不好么...

  • #8 楼 @mobiwolf

    额...

    Question: 恩,就是想看看对国内的支持 Ruby 的 PaaS 的厂商有期待么。

    Answer: 没...