我有一个带有文本类型的朋友列的用户模型.运行此迁移以使用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
我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)
无论是在开发环境还是生产环境中,这都可以在本地运行.
有没有人经历过这样的事情?
我有一个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 state
on redux 的web开发控制台中,我可以看到form.values
并且form.initial
都是包含这些initialValue值的Map对象.
我应该如何转换对象以使其"适合"到表单中.BTW我正在使用:import { Field, reduxForm } from 'redux-form/immutable'
它是redux-form 6.8.0.
我有一个模型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)
这是什么原因?
在调试此问题的过程中,我尝试在本地生产模式下运行我的应用程序,它不提供任何资产.另外,我在Heroku应用程序中有一个临时环境(与我的生产Heroku应用程序分开),它现在也显示没有任何资产的HTML.
为了调试,我:
rake assets:precompile
rails s -e production
Reload the page to get source for: http://localhost:3000/assets/application-e1f3e0c864a153c7iu66f8772a886376.css
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) 我有一个订阅控制器,其路由如下所示:
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]
我的规格如下:
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没有为我重新加载?
假设你有一个班级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) rspec ×2
ruby ×2
activerecord ×1
arrays ×1
heroku ×1
postgresql ×1
react-native ×1
redux-form ×1
routes ×1