标签: ruby

使用get和delete运行Rspec Test时,获取错误的参数数量(2表示0)

这应该是一个简单的,但却无法找出导致测试失败的原因.运行rspec时,我一直收到以下错误.但在评论"发送"方法后,一切正常.

  1) Messages GET /messages works! (now write some real specs)
     Failure/Error: get target_app_messages_path(@message.target_app.id)
     ArgumentError:
       wrong number of arguments (2 for 0)
     # ./app/controllers/messages_controller.rb:37:in `send'
Run Code Online (Sandbox Code Playgroud)

的routes.rb

resources :target_apps do 
  resources :messages do 
    member do
     post 'send'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

型号代码

class Message
  include Mongoid::Document
  belongs_to :target_app
end
Run Code Online (Sandbox Code Playgroud)

控制器代码

class MessagesController < ApplicationController
  def index
    ...
  end
  def show
    ...
  end

  ...

  def send
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

/spec/requests/message_spec.rb

describe "Messages" do
  describe "GET /messages" do

  let(:message) do
    FactoryGirl.create(:message)
  end

  it "works! …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails rspec2 rspec-rails

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

Rails:使用序列化哈希编码困境,尽管UTF8

我刚刚从ruby 1.9.2更新到ruby 1.9.3p0(2011-10-30修订版33570).我的rails应用程序使用postgresql作为其数据库后端.系统区域设置是UTF8,数据库编码也是如此.rails应用程序的默认编码也是UTF8.我有中国用户输入汉字和英文字符.字符串存储为UTF8编码的字符串.

Rails版本:3.0.9

由于更新,数据库中的一些现有中文字符串不再正确显示.这不会影响所有字符串,只会影响序列化哈希的一部分.存储为纯字符串的所有其他字符串仍然看起来是正确的.


例:

这是一个序列化哈希,在数据库中存储为UTF8字符串:

broken = "--- !map:ActiveSupport::HashWithIndifferentAccess \ncheckbox: \"1\"\nchoice: \"Round Paper Clips  \\xEF\\xBC\\x88\\xE5\\x9B\\x9E\\xE5\\xBD\\xA2\\xE9\\x92\\x88\\xEF\\xBC\\x89\\r\\n\"\ninfo: \"10\\xE7\\x9B\\x92\"\n"
Run Code Online (Sandbox Code Playgroud)

为了将此字符串转换为ruby哈希,我使用YAML.load以下命令对其进行反序列化:

broken_hash = YAML.load(broken)
Run Code Online (Sandbox Code Playgroud)

这将返回带有乱码内容的哈希:

{"checkbox"=>"1", "choice"=>"Round Paper Clips  ï¼\u0088å\u009B\u009Eå½¢é\u0092\u0088ï¼\u0089\r\n", "info"=>"10ç\u009B\u0092"}
Run Code Online (Sandbox Code Playgroud)

乱码的东西应该是UTF8编码的中文.broken_hash['info'].encoding告诉我,红宝石认为这是#<Encoding:UTF-8>.我不同意.

有趣的是,之前没有序列化的所有其他字符串看起来都很好.在同一条记录中,不同的字段包含看起来正确的中文字符---在rails控制台,psql控制台和浏览器中.每个字符串---无论是序列化哈希还是普通字符串---都保存到数据库中,因为更新看起来也很好.


我试图将乱码文本从可能错误的编码(如GB2312或ANSI)转换为UTF-8,尽管ruby声称这已经是UTF-8了,当然我失败了.这是我使用的代码:

require 'iconv'
Iconv.conv('UTF-8', 'GB2312', broken_hash['info'])
Run Code Online (Sandbox Code Playgroud)

这失败了,因为ruby不知道如何处理字符串中的非法序列.

我真的只想运行一个脚本来修复所有旧的,可能是破坏的序列化哈希字符串并完成它.有没有办法将这些断弦转换成类似中文的东西?


我只是在原始字符串中使用编码的UTF-8字符串(在上面的示例中称为"已损坏").这是在序列化字符串中编码的中文字符串:

chinese = "\\xEF\\xBC\\x88\\xE5\\x9B\\x9E\\xE5\\xBD\\xA2\\xE9\\x92\\x88\\xEF\\xBC\\x89\\r\\n\"

我注意到通过取消它(删除转义反斜杠)很容易将其转换为真正的UTF-8编码字符串.

chinese_ok = "\xEF\xBC\x88\xE5\x9B\x9E\xE5\xBD\xA2\xE9\x92\x88\xEF\xBC\x89\r\n"

这将返回一个正确的UTF-8编码的中文字符串: "?????\r\n"

只有当我使用YAML.load(...)将字符串转换为ruby哈希时,事情才会崩溃.也许我应该在它被送到之前处理原始字符串YAML.load.只是让我想知道为什么会这样......


有趣!这可能是由于YAML引擎"心理"现在在1.9.3中默认使用.我切换到"syck"引擎,YAML::ENGINE.yamler = 'syck'并正确解析损坏的字符串.

ruby postgresql yaml ruby-on-rails utf-8

9
推荐指数
2
解决办法
4910
查看次数

使用CarrierWave检索图像高度

我需要能够放置处理过的图像的尺寸.

我ImageUploader上课了:

version :post do
  process :resize_to_fit => [200, nil]
end
Run Code Online (Sandbox Code Playgroud)

有没有办法让图像的尺寸与此类似?

height = @picture.image_height(:post)
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails carrierwave

9
推荐指数
2
解决办法
5613
查看次数

如何计算Float中的小数位数?

我使用的是Ruby 1.8.7和Rails 2.3.5.

如果我有一个12.525的浮点数,怎么能得到小数点后的位数?在这种情况下,我希望得到'3'.

ruby ruby-on-rails

9
推荐指数
3
解决办法
7790
查看次数

如何将整数数组汇总为范围数组?

我想接受以下输入:

[1,2,4,5,6,7,9,13]
Run Code Online (Sandbox Code Playgroud)

把它变成如下的东西:

[[1,2],[4,7],[9,9],[13,13]]
Run Code Online (Sandbox Code Playgroud)

每个子数组代表一个整数范围.

ruby arrays algorithm functional-programming range

9
推荐指数
3
解决办法
623
查看次数

什么是$:<<"." 做Ruby的需求路径?

我不理解$:<< "."Ruby中的含义.

我将Ruby升级到1.9.1,但程序无效.我的同学告诉我,我应该补充一下$:<< "."

怎么$:<< "."办?

ruby require

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

使用Upstart管理Unicorn w/rbenv + bundler binstubs w/ruby​​-local-exec shebang

好吧,这正在融化我的大脑.这可能与我不理解Upstart以及我应该理解的事实有关.提前抱歉,这个问题很长.

我正在尝试使用Upstart来管理Rails应用程序的Unicorn主进程.这是我目前的/etc/init/app.conf:

description "app"

start on runlevel [2]
stop on runlevel [016]

console owner

# expect daemon

script
  APP_ROOT=/home/deploy/app
  PATH=/home/deploy/.rbenv/shims:/home/deploy/.rbenv/bin:$PATH
  $APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production # >> /tmp/upstart.log 2>&1
end script

# respawn
Run Code Online (Sandbox Code Playgroud)

这很好 - 独角兽开始很棒.不太好的是,检测到的PID不是独角兽大师,而是一个sh过程.这本身并不是那么糟糕 - 如果我没有使用自动化的Unicorn零停机时间部署策略.因为我发送-USR2给我的独角兽大师后不久,一个新的主人产生了,旧的主人死了......这个sh过程也是如此.所以Upstart认为我的工作已经死了,如果我愿意,我不能再用它重新启动restart或停止它stop.

我玩过配置文件,试图将-D添加到Unicorn线(如下$APP_ROOT/bin/unicorn -c $APP_ROOT/config/unicorn.rb -E production -D:)以守护Unicorn,我添加了这expect daemon条线,但这也没有用.我也试过expect fork了.所有这些事情的各种组合都可能导致start和stop挂起,然后Upstart对工作状态感到困惑.然后我必须重新启动机器来修复它.

我认为Upstart在检测何时/如果Unicorn正在分叉时遇到问题,因为我ruby-local-exec在我的$APP_ROOT/bin/unicorn脚本中使用了rbenv + shebang .这里是:

#!/usr/bin/env ruby-local-exec
#
# …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails upstart unicorn

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

如何在Capybara测试中使用Rspec验证Warden/Devise

我想在我的Rails应用程序中的Capybara测试套件中使用rspec模拟来存根登录用户(使用Devise/Warden).这将节省大量时间,并且意味着我的测试套件可以/将定期运行.

以前我可以使用authlogic通过使用如下代码来截断我的会话模型来做到这一点:

def login(user)
  user_session = mock_model(UserSession, {:user => user})
  UserSession.stub(:find).and_return(user_session)
end
Run Code Online (Sandbox Code Playgroud)

现在我正在使用Devise,我再也无法访问UserSession对象了.因为我使用capybara来测试我的代码,所以我没有直接访问请求对象来使用devise的内置sign_in测试助手.

我的问题是:我如何使用水豚,设计和规范模拟模拟登录用户,而不需要每个具有登录用户的方案首先进入注册路径,填写表单,提交,等待响应,以及然后转到所需的页面?

ruby rspec ruby-on-rails devise capybara

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

如何在rails应用程序的ruby中指定公共目录的路径?

我想解析文件public夹中的.csv文件,我试过了/../,#{RAILS_ROOT}/public但没有成功(没有这样的文件或目录错误).我不知道如何使用Rails.public_path(Rails.public_path/filename.csv不起作用)请帮忙

ruby ruby-on-rails-3

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

如何在YAML文件中使用变量?

我有YAML文件需要将变量作为输入:

outputters:
    - type        : DateFileOutputter
      name        : logfile
      level       : DEBUG
      date_pattern: '%Y%m%d'
      trunc       : 'false'
      dirname     : "/home/sameera/workspace/project/log"
      filename    : "message.log"
      formatter   :
        date_pattern: '%m/%d/%Y %H:%M:%S'
        pattern     : '%d %l - %m'
        type        : PatternFormatter
Run Code Online (Sandbox Code Playgroud)

我想传递dirname一个参数,如:

      dirname     : "<%= LOGFILE_PATH%>"
Run Code Online (Sandbox Code Playgroud)

我LOGFILE_PATH在一个名为的文件中定义init.rb.

ruby yaml ruby-on-rails

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