小编Bry*_*yce的帖子

Rails和RSpec - 测试关注类方法

我有以下(简化)Rails关注:

module HasTerms
  extend ActiveSupport::Concern

  module ClassMethods
    def optional_agreement
      # Attributes
      #----------------------------------------------------------------------------
      attr_accessible :agrees_to_terms
    end

    def required_agreement
      # Attributes
      #----------------------------------------------------------------------------
      attr_accessible :agrees_to_terms

      # Validations
      #----------------------------------------------------------------------------
      validates :agrees_to_terms, :acceptance => true, :allow_nil => :false, :on => :create
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我无法想出在RSpec中测试此模块的好方法 - 如果我只是创建一个虚拟类,当我尝试检查验证是否正常时,我会收到活动记录错误.还有其他人遇到过这个问题吗?

rspec module ruby-on-rails ruby-on-rails-3

22
推荐指数
3
解决办法
2万
查看次数

RSpec - 测试强参数

strong_parameters在控制器中使用gem,但我很难理解如何测试它.

这是我的设置示例

class UserController < ActionController::Base
  include ActiveModel::ForbiddenAttributesProtection

  def create
    @user = User.new(user_params)
    if @user.save
      ...
    end
  end

  private
  def user_params
    params.require(:user).permit(:first_name, :last_name, :username, :email)
  end
end
Run Code Online (Sandbox Code Playgroud)

我想测试该user_params方法,以确保它正确地过滤掉恶意键/值对,但无法弄清楚如何做到这一点.还有其他人经历过这个吗?

rspec ruby-on-rails ruby-on-rails-3 strong-parameters

13
推荐指数
2
解决办法
5913
查看次数

Git存储库太大了

我有一个项目,其中包含大约12MB的代码和资产.我一直在使用Git跟踪它,只是注意到我的.git文件夹现在刚刚超过1.83GB.它由几个小文件组成,然后只有一个包文件,占文件夹的1.82GB左右.

我已经运行git gc --aggressivegit gc --prune.它的大小相同.我试过了:

git reflog expire --expire=now --all
git repack -ad  # Remove dangling objects from packfiles
git prune       # Remove dangling loose objects
Run Code Online (Sandbox Code Playgroud)

但它仍然是相同的大小.我甚至克隆了它(曾经在本地进行了强制重新包装,并再次从Git获得),但每个仍然是1.83GB.这是正常的吗?有没有办法减少它的大小,或者我只是开始一个新的仓库,复制代码,并接受我的过去的提交将会消失?

git github ruby-on-rails-3 git-rewrite-history

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

RSpec控制器测试 - "分配"意外行为

我已经为我的用户模型构建了一个控制器规范,并且它通过了,虽然我觉得它应该失败.规格如下:

describe UsersController do
  include Devise::TestHelpers

  let (:user) do
    FactoryGirl.create(:user)
  end
  let (:other_user) do
    FactoryGirl.create(:user)
  end

  before :each do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    sign_in user
  end

  describe "#index" do
    it "can GET 'index'" do
      get :index
      response.should be_success
    end

    it "populates a list of users" do
      get :index
      expect(assigns(:users)).to eq([user])
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

行"expect(assigns(:users)).到eq([user])"通过,但我觉得它应该失败.毕竟,我在顶部创建了两个用户(user和other_user).我显然误解了发生的事情,有人可以解释一下吗?

bdd rspec-rails ruby-on-rails-3

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

Rails"assign_attributes"不分配嵌套模型

我有两个具有以下结构的模型:

class Wallet < ActiveRecord::Base
  include ActiveModel::Validations
  has_one :credit_card
  accepts_nested_attributes_for :credit_card

  validates :credit_card, :presence => true
  validates_associated :credit_card
  ...
end

class CreditCard < ActiveRecord::Base
  include ActiveModel::Validations
  belongs_to :wallet

  validates :card_number, :presence => true
  validates :expiration_date, :presence => true
  ...
end
Run Code Online (Sandbox Code Playgroud)

我正在用RSpec测试我的应用程序的功能,我注意到一些奇怪的东西.如果我创建属性的哈希值不符合我的嵌套模型的验证标准(如具有无CARD_NUMBER),然后尝试做一个update_attributes电话,然后我得到一个无效的信用卡式返回的钱包对象嵌套模型,以及适当的错误.这是正确的预期行为.

如果我采取相同的哈希虽然并运行assign_attributes,然后save(这是所有update_attributes方法应该做的事,然后我得到返回无效钱包对象与完全无嵌套的对象.这是为什么?我怎样才能更新所有嵌套的属性值并检查错误而不保存?

validation ruby-on-rails nested-attributes ruby-on-rails-3

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

Rails - 更改模型的默认param_key

我一直在rails中使用普通的Ruby表单对象,但为了保持我的代码组织,我最终不得不为它们添加大量的命名空间.所以我会有一个表格,如:

class User::Registration::NewForm
  extend Forwardable
  extend ActiveModel::Naming
  extend ActiveModel::Callbacks
  include ActiveModel::Conversion
  include ActiveModel::Validations

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

令人烦恼的是,我的表格的param_key变得有点令人生畏,例如 user_registration_new_form

我想以某种方式覆盖它,我认为我需要从(http://apidock.com/rails/ActiveModel/Naming/param_key/class)中删除model_name和/或param_key方法.但我无法让它发挥作用.ActiveModel::Naming

有没有人能够成功覆盖模型的默认param_key?

forms ruby-on-rails activemodel ruby-on-rails-3

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

使用Nokogiri构建空白XML标签?

我正在尝试使用Nokogiri构建XML文档.到目前为止,一切都很标准; 我的大多数代码看起来像:

builder = Nokogiri::XML::Builder.new do |xml|
    ...
    xml.Tag1(object.attribute_1)
    xml.Tag2(object.attribute_2)
    xml.Tag3(object.attribute_3)
    xml.Tag4(nil)
  end

builder.to_xml
Run Code Online (Sandbox Code Playgroud)

但是,这导致了一个标记,<Tag4/>而不是<Tag4></Tag4>,这是我的最终用户指定输出所需的.

如何告诉Nokogiri将全部标签放在零值附近?

ruby xml nokogiri

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

Rails 6 - 无法通过 Docker 联网 Webpack 开发服务器

我目前使用这些相关的 gem/库启动并运行了一个 Rails 6 应用程序:

  • 'rails', '6.1.1'(红宝石)
  • 'webpacker', '5.1.1'(红宝石)
  • "@rails/webpacker": "^5.1.1"(NPM包)
  • "webpack": "^4.0.0"(NPM包)
  • "webpack-cli": "^3.2.1"(NPM包)
  • "webpack-dev-server": "^3.1.14"(NPM包)

我的webpacker.yml文件包含以下开发服务器配置:

development:
  <<: *default
  compile: true

  dev_server:
    https: false
    host: localhost
    port: 3035
    public: localhost:3035
    hmr: false
    inline: true
    overlay: true
    compress: true
    disable_host_check: true
    use_local_ip: false
    quiet: false
    headers:
      'Access-Control-Allow-Origin': '*'
    watch_options:
      ignored: /node_modules/

Run Code Online (Sandbox Code Playgroud)

当我仅在本地计算机上运行它时,其中一个终端提供 Rails 内容 ( bundle exec rails s),另一个终端提供开发服务器内容 ( bundle exec bin/webpack-dev-server),一切都会按预期进行。

然而,我一直在尝试将所有内容转移到 Docker,但无法让开发服务器与docker-compose. 这是我的(简化的)docker-compose.yml …

ruby-on-rails docker webpack

5
推荐指数
0
解决办法
956
查看次数

Rails - 根据另一个模型验证属性

我有一个Assignment类,它同时属于User类和Role类.它存储三个值 - 对其所属的用户的引用,对其所属的角色的引用,以及指示创建Assignment实例的用户的名称的字符串值.

class Assignment < ActiveRecord::Base
  include ActiveModel::Validations

  belongs_to :user
  belongs_to :role  

  attr_accessible :user, :role, :assigned_by_user

  ...
Run Code Online (Sandbox Code Playgroud)

在我的模型验证中,我想执行检查以确保assigned_by_user属性与有效用户的名称匹配.但是,我似乎无法访问Assignment模型中的User.find(...)方法.

我将如何实现此功能?

validation ruby-on-rails ruby-on-rails-3

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

通过子before_save回调使父模型保存无效

我有两个模型,父母和孩子(如下所述).子模型有一个before_save回调来处理一些外部逻辑,如果遇到任何错误,回调会使保存的模型失效.

class Parent < ActiveRecord::Base
  has_one :child
  accepts_nested_attributes_for :child

  validates :child, :presence => true
  validates_associated :child
end

class Child < ActiveRecord::Base
  belongs_to :parent

  before_save :external_logic
  validates :parent, :presence => true

  def external_logic
    begin
      # Some logic
    rescue
      #Invalidate child model
      errors.add(:base, "external logic failed")
      return false
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是Child模型实例是通过Parent模型的嵌套属性创建的.当外部逻辑失败时,我希望不保存子模型和父模型,而是保存父模型.我怎样才能做到这一点?

请注意,我知道验证回调,但在这种情况下它们不适合.子模型回调必须是before_save.

编辑#1

我已经知道了交易,并且不认为有人告诉我"嘿,将其包装在外部交易中"作为有效的回复.这个问题明确是关于如何通过before_save调用解决这个问题.

为什么我不能在创建时使用验证 - 如注释中所述,逻辑的外部位需要保证仅在数据库保存之前运行.无论是否更改数据库记录,验证调用都可能发生多次,因此放置此逻辑是不合适的.

编辑#2

好吧,显然before_save返回false确实会阻止父项被保存.我已通过控制台验证并实际检查数据库.但是,我的rspec测试告诉了我,这只是奇怪的.特别是,这是失败的:

describe "parent attributes hash" do
  it "creates new record" do
    parent = Parent.create(:name => "name", :child_attributes => {:name …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-on-rails-3

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

Rails将部分添加到Simpleform自定义输入

我正在创建一个自定义的SimpleForm输入.它利用javascript模式弹出窗口来选择值.

如果我在表单视图中包含模态部分,我基本上可以使它工作,但我希望自定义输入将部分推送到模板.

但是,我无法让它发挥作用.我正在尝试这个,但它没有正确地呈现部分.

class ProductCategoryImageSelectInput < SimpleForm::Inputs::CollectionSelectInput
  def input

  html = ''
  html << '<a href="#myModal" role="button" data-toggle="modal">Launch demo modal</a>'

  File.open("#{Rails.root}/app/views/product_categories/_browse_modal.html.erb", 'r') do |f|
    html << f.read
  end

  end
end
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

编辑

我显然对于发布屏幕截图的用户来说太新了,但这里是功能差异的链接:

当我在表单中嵌入模态代码时,我得到了这个,这是所需的功能: 工作

当我尝试将模态代码放在自定义输入中时,我得到了这个: 不工作

ruby-on-rails-3 simple-form

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