小编Mic*_*son的帖子

Rails加载YAML以哈希并按符号引用

我在Rails 3.0.9中加载一个YAML文件,如下所示:

APP_CONFIG = YAML.load(File.read(File.expand_path('../app.yml', __FILE__)))
Run Code Online (Sandbox Code Playgroud)

它加载所有内容,如分层哈希,没问题.我不喜欢的部分是哈希只能用单引号或双引号访问而不能用符号访问.

APP_CONFIG['mailer']['username']  # works fine
APP_CONFIG[:mailer][:username]    # doesn't
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

hash yaml symbols ruby-on-rails

65
推荐指数
8
解决办法
4万
查看次数

Rails has_many通过使用source和source_type别名来处理多种类型

所以这是一个示例类

class Company < ActiveRecord::Base
    has_many :investments
    has_many :vc_firms, through: :investments, source: :investor, source_type: 'VentureFirm'
    has_many :angels, through: :investments, source: :investor, source_type: 'Person'
end
Run Code Online (Sandbox Code Playgroud)

@ company.angels和@ company.vc_firms按预期工作.但是,我如何拥有由两种源类型组成的@ company.investors?这适用于投资表中投资者专栏的所有多态?或者也许是使用范围合并所有source_type的方法?

投资模式如下:

class Investment < ActiveRecord::Base
  belongs_to :investor, polymorphic: true
  belongs_to :company

  validates :funding_series, presence: true #, uniqueness: {scope: :company}
  validates :funded_year, presence: true, numericality: true
end
Run Code Online (Sandbox Code Playgroud)

天使通过人物模型联系在一起

class Person < ActiveRecord::Base
    has_many :investments, as: :investor
end
Run Code Online (Sandbox Code Playgroud)

相关金融机构模型协会:

class FinancialOrganization < ActiveRecord::Base
    has_many :investments, as: :investor
    has_many :companies, through: :investments
end
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails associations has-many has-many-through

11
推荐指数
1
解决办法
1万
查看次数

跨多个&lt;%%&gt;标签或多行使用的Ruby DSL

我正在编写一个辅助DSL,以便更轻松地在视图中创建漂亮的菜单ui。undefined method 'safe_append=' for nil:NilClass当我在多个erb标签之间断开该块时,视图的erb会产生错误,但如果将其粘贴在一个标签中,它的效果很好。我想了解原因-它应该可以在多个标签中使用,并且更加自然。

这不起作用:

          <%= @menu.start do -%>
              <%= menu_item some_path_in_routesrb, 
                  title: "Dashboard", 
                  details: "12 New Updates", 
                  icon: "feather:home",
                  highlight: true 
              %>
              <%= menu_item next_path, 
                  title: "Magical stuff", 
                  details: "unicorn registry", 
                  icon: "fontawesome:rainbow",
                  highlight: true 
              %>
          <% end -%>
Run Code Online (Sandbox Code Playgroud)

但这有效:

          <%= @menu.start do 

                  menu_item "#", 
                  title: "Dashboard", 
                  details: "12 New Updates", 
                  icon: "fe:home",
                  first: true,
                  highlight: true 

                  menu_item organizations_path, 
                  title: "Organization", 
                  details: "33k Updates", 
                  icon: "fa:university"

          end -%>
Run Code Online (Sandbox Code Playgroud)

前面提到start的菜单方法如下所示

    def start(&block)
        if block_given?
            self.instance_eval(&block) …
Run Code Online (Sandbox Code Playgroud)

dsl ruby-on-rails erb view block

10
推荐指数
2
解决办法
221
查看次数

快速转换HTML模板到Rails资产ERB/Sass布局

我发现自己经常做同样的事情,使用设计师创建漂亮的ui然后转换HTML/CSS分割整个资产管道,找到并替换路径和css + js标签; 更新所有内容以使用资产路径.有什么能自动地做到这一点吗?

html automation ruby-on-rails converter asset-pipeline

9
推荐指数
1
解决办法
1046
查看次数

自动测试问题

我刚刚安装了Zentest 4.4.6,其中包括autotest 4.4.6,当我运行自动测试时,我收到以下错误:

gems/ZenTest-4.6.0/lib/autotest.rb:226:in `autodiscover': undefined method `any?' for Gem::Specification:Class (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

是吧?就像它没有铁轨就恢复了红宝石

ruby-on-rails autotest zentest

8
推荐指数
1
解决办法
1951
查看次数

RVM,Capistrano和bundler路径问题

当我手动安装时,生产的宝石路径与bundler + capistrano之间似乎存在差异.

在rvm安装ruby 1.9.2并创建gemset"myapp"后,我确实通过gem install bundler安装了bundler.

它安装在路径中:

/usr/local/rvm/gems/ruby-1.9.2-p290@myapp/gems

Bundler通过Capistrano将剩余的宝石安装到:

/usr/local/rvm/gems/ruby-1.9.2-p290@myapp/ruby/1.9.1/gems

我的deploy.rb文件的开头是:

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require 'rvm/capistrano'
require 'bundler/capistrano'

set :rails_env,             'production'
set :rvm_type,              :system
set :rvm_ruby_string, "ruby-1.9.2-p290@myapp"
set :rvm_path,              "/usr/local/rvm"
set :rvm_bin_path,      "#{rvm_path}/bin"
set :rvm_lib_path,      "#{rvm_path}/lib"

set :default_environment, {
  'PATH'                    => "#{rvm_path}/gems/ruby/1.9.1/bin:#{rvm_bin_path}/bin:$PATH",
  'RUBY_VERSION'    => '1.9.2',
  'GEM_HOME'        => "#{rvm_path}/gems/#{rvm_ruby_string}",
  'GEM_PATH'        => "#{rvm_path}/gems/#{rvm_ruby_string}",
  'BUNDLE_PATH'     => "#{rvm_path}/gems/#{rvm_ruby_string}"
}

set :bundle_dir,            "#{rvm_path}/gems/#{rvm_ruby_string}"
set :bundle_flags,      "--deployment --verbose"
Run Code Online (Sandbox Code Playgroud)

gem capistrano bundler rvm ruby-on-rails-3

8
推荐指数
1
解决办法
5079
查看次数

哈希上的Ruby case语句?

这听起来很奇怪,但我很乐意这样做:

case cool_hash
  when cool_hash[:target] == "bullseye" then do_something_awesome
  when cool_hash[:target] == "2 pointer" then do_something_less_awesome
  when cool_hash[:crazy_option] == true then unleash_the_crazy_stuff
  else raise "Hell"
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,我甚至不需要再次引用has,因为它就是case语句的内容.如果我只想使用一个选项,那么我会"case cool_hash [:that_option]",但我想使用任意数量的选项.另外,我知道Ruby中的case语句只评估第一个真正的条件块,有没有办法覆盖它来评估每个块都是真的,除非有中断?

ruby hash branch case-statement

8
推荐指数
4
解决办法
4999
查看次数

厨师模板变量@node似乎抛出错误

我正在通过peepcode的Chef教程,到目前为止一切顺利.由于某种原因,使用模板变量时出现故障.这个例子是针对nginx的.

在nginx/attributes/nginx.rb中我有:

default[:nginx][:worker_processes] = 4
Run Code Online (Sandbox Code Playgroud)

在nginx.conf.erb模板中我指的是:

worker_processes  <%= @node[:nginx][:worker_processes] %>;
Run Code Online (Sandbox Code Playgroud)

以下是我运行chef-solo的错误:

Template Context:
-----------------
on line #2
  1: user www-data;
  2: worker_processes  <%= @node[:nginx][:worker_processes] %>;
  3: 
  4: error_log  /var/log/nginx/error.log;
  5: pid        /var/run/nginx.pid;


[2013-07-14T19:46:36+02:00] ERROR: Running exception handlers
[2013-07-14T19:46:36+02:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated
[2013-07-14T19:46:36+02:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-07-14T19:46:36+02:00] FATAL: Chef::Mixin::Template::TemplateError: undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

错误输出的其他部分:

Starting Chef Client, version 11.4.4
Compiling Cookbooks...
Converging 3 resources
Recipe: nginx::default
  * package[nginx] action install (up …
Run Code Online (Sandbox Code Playgroud)

variables ruby-on-rails chef-infra chef-solo

7
推荐指数
1
解决办法
7622
查看次数

转换Javascript数据表以在Rails应用中使用Opal

我正在使用ajax-datatables-rails。下面是我的数据表的JS。我想将javascript转换为等效的Opal.rb。

jQuery(document).ready(function() {
  var table = $('#organizations-datatable');
  var token = $('meta[name=csrf-token]').attr('content');
  table.DataTable({
    "processing": true,
    "serverSide": true,
    "ajax": {
      "url": "/organizations/datatable.json",
      "type": 'POST',
      "beforeSend": function (xhr) {
          xhr.setRequestHeader('X-CSRF-Token', token)
        }
    },
    "pagingType": "full_numbers",
    "destroy": true,
    "columns": [
      {"data": "name"},
      {"data": "desc"},
      {"data": "industry"},
      {"data": "tags"}
    ],
    "iDisplayLength": 25
  });
});
Run Code Online (Sandbox Code Playgroud)

它包括将CSRF令牌添加到对数据的ajax请求中。

我希望我们所有的JavaScript都被编写为蛋白石,以提高可读性,等等。请不要争论这种选择,我只想了解如何通过opal / rails-ujs / opal-jquery将其用作Opalrb

下面的蛋白石与上面的JS不能实现相同的效果。谁能帮我理解原因?

jQuery(document).ready(function() {
  var table = $('#organizations-datatable');
  var token = $('meta[name=csrf-token]').attr('content');
  table.DataTable({
    "processing": true,
    "serverSide": true,
    "ajax": {
      "url": "/organizations/datatable.json",
      "type": 'POST',
      "beforeSend": …
Run Code Online (Sandbox Code Playgroud)

javascript ajax ruby-on-rails datatables opalrb

7
推荐指数
1
解决办法
290
查看次数

深层嵌套的content_tag,concat和rails 3

我很沮丧使用Rails 3.2并为Bootstrap模式制作帮手.我不明白什么时候你需要concat而不是你什么时候我不会最终丢失标签,有时我最终会得到一个哈希,其中包含之前和结束标签之间的所有选项.当我在任何带有do-end的内容标签上使用concat时,所有的地狱都会崩溃.我想做的就是复制这个html:

<div id="stupid_modal" class="modal hide fade" tabindex="-1" data-width="760">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fontello-icon-cancel-1"></i></button>
        <h4>Modal header</h4>
    </div>
    <div class="modal-body">
        <div class="page-header">
            <p>Test header 1 2 3.</p>
        </div>
        <div class="row-fluid">

           content here... blah blah

        </div>
    </div>
    <div class="modal-footer">
        <button type="button" data-dismiss="modal" class="btn">Close</button>
        <button type="button" class="btn btn-green">Save changes</button>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活获得模态标题中h4中的按钮才能正常工作.我也不能让页眉出现在模态体中.

我的助手看起来像这样:

module ModalHelper
def modal(css_id, header_text, hidden = true, options = {},&block)
    class_text = "modal"
    class_text += " hide fade" if hidden
    content_tag(:div, :class => 'modal hide fade', …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails helper twitter-bootstrap ruby-on-rails-3.2

4
推荐指数
1
解决办法
1万
查看次数

Rails模型命名部分首字母缩写词

所以.出于某种原因,我今天正在努力与Rails命名.我觉得我正在创建的模型的最佳命名是用于驼峰案例类型号名称的DNSRecord和用于蛇案例引用的dns_record - Rails想要将其命名为DnsRecord.

我已经看到了一个解决方案,如果整个单词大写,例如:API

ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'API' 
end
Run Code Online (Sandbox Code Playgroud)

但似乎不能很好地工作:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'DNSRecord' 
end
Run Code Online (Sandbox Code Playgroud)

它仍然想要参考DnsRecord.我知道这是一件小事,但DNSRecord对我来说感觉更好.

ruby model ruby-on-rails naming-conventions acronym

4
推荐指数
1
解决办法
133
查看次数

Rails Arel和Active Record谓词

我可能对Rails中的Arel对象缺乏一些了解.

你可以这样做:

u = User.arel_table
Run Code Online (Sandbox Code Playgroud)

然后和疯狂的查询添加如:

u.join(:microposts)
Run Code Online (Sandbox Code Playgroud)

(隐式.on(users [:user_id])).

但是,如何将Arel关系转换为Rails对象列表?

更新

这是一个更好的例子.我刚刚完成了Michael Hartl的Rails教程,他在Micropost控制器中做了类似的事情:

  followed_ids  = %(SELECT followed_id FROM relationships WHERE follower_id = :user_id)
  where("user_id in (#{followed_ids}) OR user_id = :user_id", :user_id => user)
Run Code Online (Sandbox Code Playgroud)

我讨厌原始的SQL.所以我想重构,到目前为止我所拥有的最好的是:

followed_ids  = Relationship.select(:followed_id).where(:follower_id => user) 
where("user_id in (#{followed_ids.to_sql}) OR user_id = :user_id", :user_id => user)
Run Code Online (Sandbox Code Playgroud)

我曾经将.map(&:follow_id).join(",")添加到关系选择中,它也有效,但是你在内存中有所有id,而不是要处理的数据库的短选择语句.

我的问题是,似乎我需要做一个.to_sql来提供给哪里并让它快乐,当它拥有它需要的所有东西来返回我的对象​​.我正在考虑切换到可以很好地完成子查询的Squeel,但我想了解Arel.

sql activerecord ruby-on-rails arel

2
推荐指数
1
解决办法
1208
查看次数

Ruby splat和<<运算符

我想做这个:

a << *b
Run Code Online (Sandbox Code Playgroud)

但这发生在irb:

1.9.3p327 :020 > a
 => [1, 2, 3, 4] 
1.9.3p327 :021 > b
 => [5, 6, 7] 
1.9.3p327 :022 > a << *b
SyntaxError: (irb):22: syntax error, unexpected tSTAR
a << *b
      ^
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

ruby ruby-on-rails bit-shift splat

1
推荐指数
1
解决办法
314
查看次数