小编rai*_*400的帖子

新数据不会持久到Postgres上的Rails数组列

我有一个带有文本类型的朋友列的用户模型.运行此迁移以使用postgres的数组功能:

add_column    :users, :friends, :text, array: true
Run Code Online (Sandbox Code Playgroud)

用户模型具有以下方法:

def add_friend(target)
  #target would be a value like "1234"
  self.friends = [] if self.friends == nil
  update_attributes friends: self.friends.push(target)
end
Run Code Online (Sandbox Code Playgroud)

以下规范通过,直到我user.reload在调用后添加#add_friend:

it "adds a friend to the list of friends" do
  user = create(:user, friends: ["123","456"])
  stranger = create(:user, uid: "789")
  user.add_friend(stranger.uid)
  user.reload #turns the spec red
  user.friends.should include("789")
  user.friends.should include("123")
end
Run Code Online (Sandbox Code Playgroud)

这也发生在开发中.模型实例已更新并在数组中具有新的uid,但是一旦在不同的操作中重新加载或重新加载用户,它将恢复到add_friend调用方法之前的状态.

使用Rails 4.0.0.rc2和pg 0.15.1

这可能是什么?

arrays postgresql ruby-on-rails ruby-on-rails-4 rails-activerecord

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

迁移不在Heroku上工作

pg:reset在Heroku上运行并且在尝试运行时db:migrate,所有迁移都会运行,但迁移失败并出现以下错误和跟踪:

rake aborted!
Error dumping database
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/postgresql_database_tasks.rb:55:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/database_tasks.rb:142:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:288:in `block (3 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:51:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:45:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

这里可以看出,有问题的线和上面的线是:

command = "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(configuration['database'])}"
raise 'Error dumping database' unless Kernel.system(command)
Run Code Online (Sandbox Code Playgroud)

无论是在开发环境还是生产环境中,这都可以在本地运行.

有没有人经历过这样的事情?

activerecord ruby-on-rails heroku

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

redux-form initialValues被创建为Map

我有一个redux-form,我正在尝试初始化表单initialValues.鉴于以下代码,表单未填充名称或年龄:

const EmployeesForm = reduxForm({
  form: 'addEmployee',
  enableReinitialize: true
})(EmployeesFormComponent)

export default connect((state, ownProps) => {
  const initialValues = { name: 'Jason', age: 24 }
  return {
    initialValues: initialValues
  }
})(EmployeesForm)
Run Code Online (Sandbox Code Playgroud)

但是在检查next stateon redux 的web开发控制台中,我可以看到form.values并且form.initial都是包含这些initialValue值的Map对象.

在此输入图像描述

我应该如何转换对象以使其"适合"到表单中.BTW我正在使用:import { Field, reduxForm } from 'redux-form/immutable'它是redux-form 6.8.0.

react-native redux-form

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

为什么我必须在使用客户验证器后重新加载rspec中的记录?

我有一个模型User,它在创建后在回调中创建了选项

# User
has_one :user_options

after_create :create_options

private

def create_options
  UserOptions.create(user: self)
end
Run Code Online (Sandbox Code Playgroud)

我有一些简单的Rspec报道:

describe "new user" do
  it "creates user_options after the user is created" do
    user = create(:user)
    user.user_options.should be_kind_of(UserOptions)
  end
end
Run Code Online (Sandbox Code Playgroud)

在我向用户模型添加自定义验证之前,一切正常.

validate :check_whatever, if: :blah_blah
Run Code Online (Sandbox Code Playgroud)

现在规范失败了,让它通过的唯一方法是重新加载规范中的记录:

it "creates user_preferences for the user" do
  user = create(:user)
  user.reload
  user.user_options.should be_kind_of(UserOptions)
end
Run Code Online (Sandbox Code Playgroud)

这是什么原因?

ruby rspec ruby-on-rails

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

Rails不在生产或登台环境中提供资产

在调试此问题的过程中,我尝试在本地生产模式下运行我的应用程序,它不提供任何资产.另外,我在Heroku应用程序中有一个临时环境(与我的生产Heroku应用程序分开),它现在也显示没有任何资产的HTML.

为了调试,我:

  1. 杀死服务器
  2. 清除tmp/cache/assets
  3. 删除公共/资产
  4. rake assets:precompile
  5. 启动服务器 rails s -e production
  6. 访问该页面并打开Web检查器,然后单击application.css链接的展开箭头 Reload the page to get source for: http://localhost:3000/assets/application-e1f3e0c864a153c7iu66f8772a886376.css
  7. 重新加载页面什么都不做.

Production.rb:

config.cache_classes = true
config.consider_all_requests_local       = false
config.action_controller.perform_caching = true
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
config.assets.compress = false
config.assets.compile = false
config.assets.digest = true
Run Code Online (Sandbox Code Playgroud)

Staging.rb:

config.cache_classes = true
config.consider_all_requests_local       = false
config.action_controller.perform_caching = true
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
config.assets.compress = false
config.assets.compile = false
config.assets.digest = …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails-3 asset-pipeline

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

使用非平静操作清理Rails路由

我有一个订阅控制器,其路由如下所示:

get  'user/:user_id/subscription_requests' => 'subscriptions#index', as: :subscription_requests
post 'user/:user_id/subscribe'             => 'subscriptions#subscribe', as: :user_subscribe
post 'user/:user_id/unsubscribe'           => 'subscriptions#unsubscribe', as: :user_unsubscribe
post 'user/:user_id/request_subscription'  => 'subscriptions#request_subscription', as: :request_user_subscription
post 'user/:user_id/accept_subscription'   => 'subscriptions#accept', as: :accept_subscription_request
post 'user/:user_id/reject_subscription'   => 'subscriptions#reject', as: :reject_subscription_request
Run Code Online (Sandbox Code Playgroud)

所有这些index都是非平静的行为.如何在路径文件中使用类似于resources保持user/:user_id/路径的方式使其更清洁?

更新清晰度:

我试图避免逐行列出路由,而是做一些类似rails提供的其余操作.就像是:

resources :subscription_requests, :only => [:subscribe, :unsubscribe, :reject, :accept, etc]

routes ruby-on-rails

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

为什么我必须在rspec规范中重新加载实例变量?

我的规格如下:

describe 'toggle_approval' do
  before(:each) do
    @comment = Comment.make(id: 55, approved: false)
  end

  it "toggles the visibility of the discussion" do
    post :toggle_approval, id: 55
    #@comment.reload
    @comment.approved.should be_true
  end
end
Run Code Online (Sandbox Code Playgroud)

除非我取消注释重新加载注释的行,否则此规范将失败.为什么rails没有为我重新加载?

rspec ruby-on-rails

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

Demeter的定律是否也适用于标准的ActiveRecord对象方法?

假设你有一个班级Car,其中有一个班级Driver.如果您想访问驱动程序的年龄,您可以:

@car.driver_age
Run Code Online (Sandbox Code Playgroud)

代替

@car.driver.age
Run Code Online (Sandbox Code Playgroud)

如果您已在Car模型中委派了驱动程序的age属性(前缀设置为true).

但是,如果你还有一个Passenger班级而且你想要获得车内乘客的数量,以下是不违反得墨忒耳法则,或者我的想法过于热心:

@car.passengers.count
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails law-of-demeter

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