我有一个名为CachedObjectstore 的类,用于存储由key索引的通用序列化对象.我希望这个类实现一个create_or_update方法.如果找到一个对象,它将更新它,否则它将创建一个新对象.
有没有办法在Rails中执行此操作,还是我必须编写自己的方法?
我有一个问题类:
class Question < ActiveRecord::Base
attr_accessible :user_id, :created_on
validates_uniqueness_of :created_on, :scope => :user_id
end
Run Code Online (Sandbox Code Playgroud)
给定用户每天只能创建一个问题,因此我希望通过唯一索引强制数据库中的唯一性,并通过validates_uniqueness_of强制使用Question类.
我遇到的麻烦是我只想要非管理员用户的约束.因此,管理员可以根据需要每天创建尽可能多的问题.如何实现优雅的任何想法?
我使用ActionCable实现了一个实时聊天系统.它可以工作,但我不断从Rollbar获取/cable生产中的端点(Heroku)的异常通知.
2017-07-18T15:36:54.738588+00:00 heroku[router]: at=info method=GET path="/cable?user_id=63191&client=Gc-CvUfsgAW70KMpIBX25A&access_token=MoBTM2jF9wTwqblMsXQcVA" host=my-api.herokuapp.com request_id=b6cc263c-19e4-4207-8ce4-65ed6a130133 fwd="61.55.27.1" dyno=web.1 connect=0ms service=1727122ms status=101 bytes=22232 protocol=https
Run Code Online (Sandbox Code Playgroud)
请注意,它花了1727122ms.如果websocket处于活动状态,那就不足为奇了,但即使客户端已停止执行任何操作,它似乎也会保持打开状态.我是否在ActionCable配置错误,或者这是预期的?我应该在Rollbar中禁止错误通知吗?
我有以下课程:
CachedObject
CachedObjectSource
CachedObjectDbSource < CachedObjectSource
CachedObjectDalliSource < CachedObjectSource
Run Code Online (Sandbox Code Playgroud)
CachedObject是一个非数据库对象,它从第三方API中提取并存储在本地.CachedObject将存储在数据库和Dalli(memcache)中,实时代码将ping Dalli源以获取对象的副本,并且Dalli源将搜索数据库源并在对象不存在时更新其缓存.所以它是一个嵌套调用,要求CachedObjectSource的每个子类实现相同的方法集.IE,一个界面.
有没有办法编写CachedObjectSource类,以便其子类必须实现接口?我是以错误的方式来做这件事的吗?
我有一个类API,它从第三方API中提取对象,并将它们构建为类型的子类APIObject. APIObject子类匹配我从中提取的API中的对象名称:
User < APIObject
Account < APIObject
Run Code Online (Sandbox Code Playgroud)
我想在APIObject中定义一个类方法,允许我使用标准的Rails访问器来提取对象:
user = User.find id
Run Code Online (Sandbox Code Playgroud)
我想将此调用转换为API调用的方法如下:
API::User::findById id
Run Code Online (Sandbox Code Playgroud)
我想访问APIObject子类(User)的名称,self.class.name并使用它来调用constant(API::User),但我知道API::self.class.name不会工作.我可以一遍又一遍地为每个子类重写这个方法,但看起来这应该是可能的,不用这样做.建议?
我有这个存储序列化对象的表:
class CachedObject < ActiveRecord::Base
attr_accessible :key, :data
validates_uniqueness_of :key
end
Run Code Online (Sandbox Code Playgroud)
数据列存储由key索引的序列化对象.很简单.我正在运行此代码来测试:
key = "test"
obj = {"test" => "test"}
row = CachedObject.find_or_create_by_key key
row.data = obj.to_json
row.save
Run Code Online (Sandbox Code Playgroud)
该对象正在创建,但它不会保存回数据库.没有错误消息.我在这做错了什么?
我正在使用Ancestry在Rails中构建一个分层类别,我允许用户选择他们正在创建的对象的父级.我使用下拉列表显示现有类别:
<%= f.input :ancestry, collection: Category.sorted_list %>
Run Code Online (Sandbox Code Playgroud)
只要用户选择现有节点,一切都很好.如果用户在下拉列表中选择空白,我希望Ancestry创建一个根节点,但是表单会抛出"无效"错误.
我的控制器没有做任何令人费解的事情:
def update
@category = Category.find(params[:id])
respond_to do |format|
if @category.update_attributes(params[:category])
format.html { redirect_to @category, notice: 'Category was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @category.errors, status: :unprocessable_entity }
end
end
end
Run Code Online (Sandbox Code Playgroud)
我是Rails的新手,所以我不确定如何解决这个问题.我错过了Ancestry的配置,还是这个表格验证器可能过度保护?
我对 Devise 和 paranoia(acts_as_paranoid) gem 有一个复杂的问题。我的用户模型相对简单:
class User < AR::Base
devise :confirmable, :other_config_options
acts_as_paranoid
end
Run Code Online (Sandbox Code Playgroud)
我首先添加了 Devise gem,但没有可确认的选项。然后我后来在这次迁移中添加了可确认的选项:
def up
add_column :users, :confirmed_at, :datetime
add_column :users, :confirmation_token, :string
add_column :users, :confirmation_sent_at, :datetime
add_column :users, :unconfirmed_email, :string
add_index :users, :confirmation_token, unique: true
User.update_all(:confirmed_at => Time.now)
end
Run Code Online (Sandbox Code Playgroud)
到目前为止没有问题。然后我将 Paranoia gem 和acts_as_paranoid线条添加到用户模型中。我的数据库在当前状态下运行良好,但我正在尝试重置数据库以将其与生产数据同步,这就是我遇到问题的地方。当我执行 db:reset 时,上述迁移失败:
PG::UndefinedColumn: ERROR: column users.deleted_at does not exist
Run Code Online (Sandbox Code Playgroud)
问题是我的模型包含一个acts_as_paranoid仅对当前数据库快照有效的指令。如果我回滚到以前User::deleted_at不存在的数据库快照,偏执狂 gem 仍会尝试仅更新未删除的对象,并且我的查询失败。
有什么想法可以优雅地处理这种情况吗?
我正在使用Devise和ActiveAdmin,我让他们users通过is_admin标志共享一个表.我的路线文件如下所示:
Site::Application.routes.draw do
devise_for :users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
end
Run Code Online (Sandbox Code Playgroud)
这给了我这些路线
Prefix Verb URI Pattern Controller#Action
new_user_session GET /admin/login(.:format) active_admin/devise/sessions#new
user_session POST /admin/login(.:format) active_admin/devise/sessions#create
destroy_user_session DELETE|GET /admin/logout(.:format) active_admin/devise/sessions#destroy
user_password POST /admin/password(.:format) active_admin/devise/passwords#create
new_user_password GET /admin/password/new(.:format) active_admin/devise/passwords#new
edit_user_password GET /admin/password/edit(.:format) active_admin/devise/passwords#edit
PATCH /admin/password(.:format) active_admin/devise/passwords#update
PUT /admin/password(.:format) active_admin/devise/passwords#update
cancel_user_registration GET /admin/cancel(.:format) devise/registrations#cancel
user_registration POST /admin(.:format) devise/registrations#create
new_user_registration GET /admin/sign_up(.:format) devise/registrations#new
edit_user_registration GET /admin/edit(.:format) devise/registrations#edit
PATCH /admin(.:format) devise/registrations#update
PUT /admin(.:format) devise/registrations#update
DELETE /admin(.:format) devise/registrations#destroy
Run Code Online (Sandbox Code Playgroud)
我希望管理仪表板可用/admin,但我希望用户管理部分可用/users.所以new_user_session将/users/login代替 …
我在 Ruby 中有一个非数据库支持的类:
class User
attr_accessor :countries
end
Run Code Online (Sandbox Code Playgroud)
我希望国家只是一组 ISO 国家代码(美国、GB、CA、AU 等),我不想建立一个单独的模型来保存每个国家代码。有没有一种神奇的方法可以让 Ruby 理解这:countries是一个数组并相应地对待它,或者我是否需要编写countriesandcountries=方法?
我尝试使用 user.countries = ['US'] 设置国家数组,但我收到了 NoMethodError。
我正在使用遵循JSON API规范的API.
http://jsonapi.org/
Run Code Online (Sandbox Code Playgroud)
我正在使用ngResource在Ionic中构建应用程序,而resource.query()方法希望响应是一个数组:
[
{
"id": 1,
"foo": "bar"
},
{
...
}
]
Run Code Online (Sandbox Code Playgroud)
但是JSON API规范传递了嵌套在该data属性下的内容:
{
"data": [
{
"id": 1,
"foo": "bar"
},
{
...
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何自动后处理来自API的响应以满足ngResource的期望?
我有以下模型:
Company
has_many :users
has_many :accounts
User
belongs_to :company
Account
belongs_to :company
Run Code Online (Sandbox Code Playgroud)
用户应该可以通过他们的公司访问某些资源,我想用Cancan隐式加载这些资源:
class AccountsController < ApplicationController
load_resource # Cancan doesn't know how to load through the user's company
Run Code Online (Sandbox Code Playgroud)
我显然可以明确地做到这一点:
class AccountsController
def index
@accounts = current_user.company.accounts
end
Run Code Online (Sandbox Code Playgroud)
但这似乎是不必要的代码,我怀疑已经有了一种模式。
我看到Cancan可以through在当前用户上定义一个:
class AccountsController
load_resource through: :current_user
Run Code Online (Sandbox Code Playgroud)
但这会打电话给您current_user.accounts-这是无效的,因为帐户属于公司,而不是用户。我可以将accounts呼叫从User(用户)转移到Company(公司),但这似乎很容易。
我也尝试传递一个字符串:
class AccountsController
load_resource through: 'current_user.company'
Run Code Online (Sandbox Code Playgroud)
那给了我 '@current_user.company' is not allowed as an instance variable name
我做了一些谷歌搜索,但是找不到。有什么帮助吗?
ruby ×3
activerecord ×2
oop ×2
actioncable ×1
activeadmin ×1
ancestry ×1
angularjs ×1
cancan ×1
cancancan ×1
devise ×1
heroku ×1
migration ×1
ngresource ×1
rollbar ×1