我希望我的枚举字段有一个默认值,以防止它为零.我做了以下事情:
# db/schema.rb
create_table "templates", force: :cascade do |t|
t.integer "status"
end
# app/models/template.rb
class Template < ActiveRecord::Base
STATUSES = [:draft, :published]
enum status: STATUSES
after_initialize :init
def init
self.status ||= STATUSES.index(:draft)
end
end
Run Code Online (Sandbox Code Playgroud)
我在当地环境中获得了预期的结果.但在heroku中并不完全.我需要它draft在更新状态后成为默认值nil,但在此上下文中它变为nil但是published范围仍然包括更新的行.
$ heroku run rails console
> Template.published.pluck :id
=> [1, 2]
> Template.find(1).update(status:nil)
Template Load (4.4ms) SELECT "templates".* FROM "templates" WHERE "templates"."id" = $1 LIMIT 1 [["id", 1]]
Template Load (4.4ms) SELECT "templates".* FROM "templates" WHERE "templates"."id" …Run Code Online (Sandbox Code Playgroud) 在我的routes.rb我有
namespace :admin do
resources :clients do, only: [:index] do
resources :products, only: [:index, :new, :create]
end
resources :products, only: [:index]
end
Run Code Online (Sandbox Code Playgroud)
请注意,我有两行resources :products. 一个嵌套在 中resources :clients,另一个作为 上的顶级资源:admin;这两者在应用程序中都有不同的目的。
rake routes给我:
admin_clients GET /admin/clients(.:format) admin/clients#index
admin_client_products GET /admin/clients/:client_id/products(.:format) admin/products#index
POST /admin/clients/:client_id/products(.:format) admin/products#create
new_admin_client_product GET /admin/clients/:client_id/products/new(.:format) admin/products#new
admin_products GET /admin/products(.:format) admin/products#index
Run Code Online (Sandbox Code Playgroud)
我有一个admin_client_products嵌套product#index资源。我也有admin_products顶级product#index资源。然而,它们指向相同的控制器操作:admin/product#index。
问题:此时,我需要 Rails 来推断这是两个不同的操作。使用rails约定,有没有办法告诉rails这两个资源应该有不同的控制器操作,即一个应该命中,admin/products#index另一个应该命中admin/clients/products#index?
嵌套路由应该这样:
class Admin::Clients::ProductsController < …Run Code Online (Sandbox Code Playgroud) 此处解释了在 ActiveRecord 范围内使用 active admin:Rails3 Active Admin:如何在第一次单击 Shipments 标签时仅显示打开状态记录?
现在我正在尝试使用 params为范围做这件事。
在我的模型中,我有:
#app/models/shipments.rb
scope :by_status, -> (status) { where(status: status) }
Run Code Online (Sandbox Code Playgroud)
我希望能够将其用于app/admin/shipments.rb类似
# app/admin/shipments.rb
scope :by_status 'open'
Run Code Online (Sandbox Code Playgroud)
有没有一种主动的管理方式来做到这一点?
我有一个来自我的活动管理员的json字符串 "{\"en\":\"Lorem\"}"
我想将其保存在question.namepostgres jsonb类型的字段中。
class Question < ActiveRecord::Base
serialize :name
end
# db/schema.rb
create_table "preset_questions", force: :cascade do |t|
t.jsonb "name", default: {}
end
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
question.update(name:"{\"en\":\"Lorem\"}")
question.update(name:JSON.parse("{\"en\":\"Lorem\"}"))
Run Code Online (Sandbox Code Playgroud)
两者的结果:
question.name
=> nil
Run Code Online (Sandbox Code Playgroud)