标签: activemodel

form_for非AR模型 - fields_for Array属性不迭代

我无法fields_for开始处理非ActiveRecord模型的Array属性.

蒸馏下来,我必须遵循:

车型/ parent.rb

class Parent
  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations
  extend ActiveModel::Translation

  attr_accessor :bars
end
Run Code Online (Sandbox Code Playgroud)

控制器/ parent_controller.rb

def new_parent
  @parent = Parent.new

  @parent.bars = ["hello", "world"]
  render 'new_parent'
end
Run Code Online (Sandbox Code Playgroud)

意见/ new_parent.html.haml

= form_for @parent, :url => new_parent_path do |f|
  = f.fields_for :bars, @parent.bars do |r|
    = r.object.inspect
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我的页面包含["hello", "world"]- 也就是inspect调用分配给的数组的结果bars.(@parent.bars省略了fields_for,我只是nil显示).

如何使fields_forAR关联成为行为 - 也就是说,对于我的bars数组的每个成员,在块中执行一次代码?

activemodel ruby-on-rails-3

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

Ruby on Rails 3(3.1)ActiveModel关联(无表格嵌套模型)

如何实现ActiveModel关联(无表格嵌套模型)?

例如:

book has many chapters
Run Code Online (Sandbox Code Playgroud)

使用ActiveRecord,我将创建两个模型并使用has_manybelongs_to进行分析.但是ActiveModel没有这样的功能.我该如何实现呢?

activemodel ruby-on-rails-3

8
推荐指数
2
解决办法
8011
查看次数

rails 3.2.0和heroku

嘿伙计我在使用rails 3.2.0和ruby 1.9.3时遇到了一些麻烦,我只使用rails new命令创建了一个新的应用程序,我正在尝试部署到heroku.我有以下应用程序错误:

应用程序中发生错误,无法提供您的页面.请稍后重试.如果您是应用程序所有者,请检查日志以获取详细信息.

运行heroku日志后,我收到以下错误:

无法在任何来源中找到activemodel-3.2.0

提前致谢!!!!

的Gemfile

source 'https://rubygems.org'

gem 'rails', '3.2.0'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'


# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer'

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', …
Run Code Online (Sandbox Code Playgroud)

ruby heroku activemodel ruby-on-rails-3

8
推荐指数
2
解决办法
5435
查看次数

Rails 5 throw abort:如何设置错误消息?

Rails已经引入了这种throw(:abort)语法,但现在我如何获得有意义的销毁错误?

对于验证错误,人们会这样做

if not user.save
  # => user.errors has information

if not user.destroy
  # => user.errors is empty
Run Code Online (Sandbox Code Playgroud)

这是我的模特

class User

  before_destroy :destroy_validation,
    if: :some_reason

  private

  def destroy_validation
    throw(:abort) if some_condition
  end
Run Code Online (Sandbox Code Playgroud)

activemodel ruby-on-rails-5

8
推荐指数
2
解决办法
7869
查看次数

Rubocop 唯一性验证应该使用唯一索引,在从某些特定值开始的值中

我有一个 Rails 模型,用于验证 order_number 值的唯一性,它应该从 1_000_000 开始,因此我添加了一个用作第一个值的变量:

# order model 
STARTING_NUMBER = 1_000_000

validates :order_number, uniqueness: true
Run Code Online (Sandbox Code Playgroud)

当我通过 Rubocop 检查我的代码时,出现错误:

app/models/order.rb:3:3: C: Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.
  validates :order_number, uniqueness: true
Run Code Online (Sandbox Code Playgroud)

disable/enable我通过添加Rubocop 评论来修复它:

STARTING_NUMBER = 1_000_000

# rubocop:disable Rails/UniqueValidationWithoutIndex
validates :order_number, uniqueness: true
# rubocop:enable Rails/UniqueValidationWithoutIndex
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?

ruby ruby-on-rails activemodel rails-activerecord rubocop

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

Rails验证以确保用户名不会与现有路由冲突?

我想确保用户无法创建与我现有路由冲突的用户名.我也希望能够拒绝我可能定义的未来路线.我想要完成这样的事情:

在模型中:

class User < ActiveRecord::Base
  @@invalid_usernames = %w()

  cattr_accessor :invalid_usernames

  validates :username, :exclusion { :in => @@invalid_usernames }
end
Run Code Online (Sandbox Code Playgroud)

在一些初始化程序中:

User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
Run Code Online (Sandbox Code Playgroud)

这是"Rails方式"吗?有没有更好的办法?

validation activerecord ruby-on-rails activemodel ruby-on-rails-3

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

获取ActiveModel :: Callbacks以使用ActiveResource

我试图让ActiveModel :: Callbacks与ActiveResource(特别是after_initialize)一起使用Rails 3应用程序,但我似乎无法让它工作.我没有得到任何错误,但回调方法永远不会执行.

这是一段代码

class User < ActiveResource::Base
  extend ActiveModel::Callbacks
  define_model_callbacks :initialize, :only => :after

  after_initialize :update_info

  def update_info
    puts 'info'
  end 
end
Run Code Online (Sandbox Code Playgroud)

出于某种原因,从不执行update_info.任何人都知道如何让这个工作?

activeresource activemodel ruby-on-rails-3

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

Rails 3 ActiveModel:不能直接包含ActiveModel :: Model

在我尝试拥有一个活动模型的Rails 3.2.11和"开发"环境中:

class DisponibilityApi
  include ActiveModel::Model

  attr_accessor :start_time, :end_time 
  validates :start_time, :end_time, :presence => true

end
Run Code Online (Sandbox Code Playgroud)

我有一个错误:

NameError:未初始化的常量ActiveModel :: Model

但是当我手动包含它时:

class DisponibilityApi
  extend  ActiveModel::Naming
  extend  ActiveModel::Translation
  include ActiveModel::Validations
  include ActiveModel::Conversion

  attr_accessor :start_time, :end_time 
  validates :start_time, :end_time, :presence => true

end
Run Code Online (Sandbox Code Playgroud)

现在它有效!

我错过了什么吗?

谢谢 !

ruby-on-rails activemodel rails-activerecord

7
推荐指数
2
解决办法
5125
查看次数

Rails 3.2到4.0升级:false的未定义方法to_datetime:FalseClass

我正在升级我从3.2继承到4.0.1的Rails应用程序.我跟着完了边缘指南:

http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-3-2-to-rails-4-0

除了一个我似乎无法找到根本原因的错误之外,我已经解决了所有问题.当我尝试保存用户模型对象时,我遇到以下错误:

[1] pry(main)> User.create(name: "test user", email: "testuser@frobnitz.com", password: "testPassword123", password_confirmation: "testPassword123")                                                                                                                               

(0.6ms)  BEGIN
(0.9ms)  ROLLBACK
NoMethodError: undefined method `to_datetime' for false:FalseClass
from /home/cmhobbs/src/serve2perform/.gem/ruby/2.3.0/gems/activesupport-4.0.1/lib/active_support/core_ext/date_time/calculations.rb:161:in `<=>'
Run Code Online (Sandbox Code Playgroud)

activesupportrals安装了4.0.1和4.0.1.我使用chgems并清除了我的.gem/目录,Gemfile.lock然后再捆绑.

这是用户模型要点.

这里是所有的回溯输出的,我可以从中获取pry.

以下是User表架构链接.

ruby-on-rails activesupport activemodel ruby-on-rails-3 ruby-on-rails-4

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

ActiveModel::脏字段和 JSON 字段

我正在使用ActiveModel::Dirty来跟踪表单中所做的更改。现在一切都按我的预期进行。对于像电话号码这样在表单中出现破折号的东西,我只需对其进行格式化,然后电话号码就不会出现在.changed预期行为的列表中。

但是,我遇到了一个问题,即我在配置文件模型中使用 jsonb 字段。所以问题是 ActiveModel 会将 JSONB 字段列为已更改,即使我专门对其进行格式化以匹配它之前的外观。这不是预期的行为。更奇怪的是,我的另一个 JSONB 专栏并没有经历这种疯狂。

我遇到问题的 JSONB 字段看起来像这样, store_accessor :user_details, :names, :other_field store_accessor :bank_details, :bank_city, :bank_name user_details并且bank_details是 jsonb 列。需要注意的一些事情:names 是一个数组,other_field 是一个字符串。bank_city 和bank_name 是字符串。

任何人都可以深入了解为什么 :user_details 特别是在解决这个问题,而不是 :bank_details JSON 列?

我怀疑这可能是由于我在 :user_details 中使用了一个数组,并且我怀疑 ActiveModel 源代码中的某处发生了比较,但也许我错了?

编辑:我发现这肯定是因为我使用数组来表示:名称。我将其更改为字符串,它不再认为 JSON 列已更改。我要深入研究 ActiveModel 源代码,看看是否能找到原因。

编辑#2:出于某种原因,我以为我什么都不做就解决了这个问题,但我是一个假人,意识到我已经删除了表单中的某些内容。所以这个问题对我来说还没有解决。任何见解都会令人惊奇。通过查看 ActiveModel::Dirty 源代码,我无法弄清楚为什么会发生这种情况。我不完全确定该去哪里寻找。去打一下byebugs看看是否有帮助。

编辑#3:重复此问题的步骤

创建带有 JSONB 列的 Rails 模型。设置商店访问器,您只需要一个即可完成此操作。使用验证器或格式化程序将其默认设置为空数组。为您的模型提供 ActiveModel::Dirty 包含。运行 Rails 控制台。运行以下命令。假设 user_details 是 JSONB 列,其存储访问器是名称。

  a = Profile.user_details
  a.user_details = { "names" => [{"first_name" => "", "last_name" …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails activemodel

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