我有以下(简化)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中测试此模块的好方法 - 如果我只是创建一个虚拟类,当我尝试检查验证是否正常时,我会收到活动记录错误.还有其他人遇到过这个问题吗?
我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方法,以确保它正确地过滤掉恶意键/值对,但无法弄清楚如何做到这一点.还有其他人经历过这个吗?
我有一个项目,其中包含大约12MB的代码和资产.我一直在使用Git跟踪它,只是注意到我的.git文件夹现在刚刚超过1.83GB.它由几个小文件组成,然后只有一个包文件,占文件夹的1.82GB左右.
我已经运行git gc --aggressive和git 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.这是正常的吗?有没有办法减少它的大小,或者我只是开始一个新的仓库,复制代码,并接受我的过去的提交将会消失?
我已经为我的用户模型构建了一个控制器规范,并且它通过了,虽然我觉得它应该失败.规格如下:
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).我显然误解了发生的事情,有人可以解释一下吗?
我有两个具有以下结构的模型:
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方法应该做的事,然后我得到返回无效钱包对象与完全无嵌套的对象.这是为什么?我怎样才能更新所有嵌套的属性值并检查错误而不保存?
我一直在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?
我正在尝试使用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将全部标签放在零值附近?
我目前使用这些相关的 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 …
我有一个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(...)方法.
我将如何实现此功能?
我有两个模型,父母和孩子(如下所述).子模型有一个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) 我正在创建一个自定义的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)
有什么想法吗?
编辑
我显然对于发布屏幕截图的用户来说太新了,但这里是功能差异的链接:
当我在表单中嵌入模态代码时,我得到了这个,这是所需的功能: 工作
当我尝试将模态代码放在自定义输入中时,我得到了这个: 不工作
rspec ×2
validation ×2
activemodel ×1
bdd ×1
docker ×1
forms ×1
git ×1
github ×1
module ×1
nokogiri ×1
rspec-rails ×1
ruby ×1
simple-form ×1
webpack ×1
xml ×1