小编kid*_*rew的帖子

Rails创建或更新魔术?

我有一个名为CachedObjectstore 的类,用于存储由key索引的通用序列化对象.我希望这个类实现一个create_or_update方法.如果找到一个对象,它将更新它,否则它将创建一个新对象.

有没有办法在Rails中执行此操作,还是我必须编写自己的方法?

activerecord ruby-on-rails

88
推荐指数
5
解决办法
9万
查看次数

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类.

我遇到的麻烦是我只想要非管理员用户的约束.因此,管理员可以根据需要每天创建尽可能多的问题.如何实现优雅的任何想法?

ruby-on-rails validates-uniqueness-of

32
推荐指数
2
解决办法
3万
查看次数

Heroku上的ActionCable服务器响应时间

我使用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中禁止错误通知吗?

ruby-on-rails heroku actioncable rollbar

17
推荐指数
1
解决办法
317
查看次数

Ruby接口类?

我有以下课程:

CachedObject
CachedObjectSource
CachedObjectDbSource < CachedObjectSource
CachedObjectDalliSource < CachedObjectSource
Run Code Online (Sandbox Code Playgroud)

CachedObject是一个非数据库对象,它从第三方API中提取并存储在本地.CachedObject将存储在数据库和Dalli(memcache)中,实时代码将ping Dalli源以获取对象的副本,并且Dalli源将搜索数据库源并在对象不存在时更新其缓存.所以它是一个嵌套调用,要求CachedObjectSource的每个子类实现相同的方法集.IE,一个界面.

有没有办法编写CachedObjectSource类,以便其子类必须实现接口?我是以错误的方式来做这件事的吗?

ruby oop

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

按名称动态获取Ruby类常量

我有一个类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不会工作.我可以一遍又一遍地为每个子类重写这个方法,但看起来这应该是可能的,不用这样做.建议?

ruby oop

13
推荐指数
1
解决办法
7990
查看次数

Rails ActiveRecord对象不保存

我有这个存储序列化对象的表:

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)

该对象正在创建,但它不会保存回数据库.没有错误消息.我在这做错了什么?

activerecord ruby-on-rails

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

没有父母的Rails祖先

我正在使用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的配置,还是这个表格验证器可能过度保护?

ruby-on-rails ancestry

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

Rails acts_as_paranoid 迁移问题

我对 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 仍会尝试仅更新未删除的对象,并且我的查询失败。

有什么想法可以优雅地处理这种情况吗?

migration ruby-on-rails acts-as-paranoid

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

Rails Devise和ActiveAdmin单一模型路由

我正在使用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-on-rails devise activeadmin

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

具有数组属性的 Ruby 类

我在 Ruby 中有一个非数据库支持的类:

class User
  attr_accessor :countries
end
Run Code Online (Sandbox Code Playgroud)

我希望国家只是一组 ISO 国家代码(美国、GB、CA、AU 等),我不想建立一个单独的模型来保存每个国家代码。有没有一种神奇的方法可以让 Ruby 理解这:countries是一个数组并相应地对待它,或者我是否需要编写countriesandcountries=方法?

我尝试使用 user.countries = ['US'] 设置国家数组,但我收到了 NoMethodError。

ruby

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

ngResource和Json API规范

我正在使用遵循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的期望?

angularjs ngresource

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

Rails / Cancan-通过关联加载资源

我有以下模型:

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-on-rails cancan cancancan

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