Rails 4:模型验证不适用于创建

Rails 4: Model validation not working on create

我有一些看起来很简单的代码,让我摸不着头脑。

这是一个用户模型:

class User < ActiveRecord::Base
  has_one :api_account, inverse_of: :user, dependent: :destroy

# Other user-specific validations come after

这是关联的 api_account:

class ApiAccount < ACtiveRecord::Base
  belongs_to :user, inverse_of: :api_account
  validates :access_token, presence: true
  validates :user, presence: true,
                   uniqueness: true

在 api_account 控制器中,我有:

response = ### Some JSON response from a distant server

@api_account = @user.create_api_account(:access_token => response[:access_token])

api_account 的架构如下所示:

create_table "api_accounts", force: true do |t|
  t.text     "access_token"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "user_id"
end

add_index "api_account", ["user_id"], name: "index_api_accounts_on_user_id"

每当我 运行 代码时,我都会在响应变量中获得访问令牌。当我使用 rails 控制台检查数据库时,我看到一个保存的实例具有有效的创建和更新时间,但是 access_token 和 user_id 的值为 nil。

首先,我还是不明白为什么这两个字段没有值。其次,为什么它们保存为零值(即通过验证)。

我们非常欢迎任何帮助。虽然,我感觉到一掌来了! :)

@igreka,我认为你应该在你的 api_account 控制器中尝试这个 -

@api_account = @user.create_api_account(:access_token => api_account_params)

私人

def api_account_params

json_params=ActionController::Parameters.new(JSON.parse(响应[:access_token]))

return json_params.require(:api_account).允许!)

结束

希望这可以解决您的问题。

事实证明,Rails 阻止您在没有 "strong parameters" 的情况下成功使用内置 "save" 和 "create" 方法。

解决方法不是从控制器中保存,而是在模型本身中使用如下自定义函数保存:

def CloudAccount.create_or_update(user, provider, token)
 raw_params = {provider: provider, access_token: access_token}
 params     = ActionController::Parameters.new(raw_params)
 if @cloud_account = CloudAccount.find_by(user_id, provider: provider)
   @cloud_account.update(params.permit(:access_token)
 else
   @cloud_account = user.cloud_accounts.create(params.permit(:provider, :access token
end

如您所见,将 API 访问代码隔离到与用户模型关联的专用模型和控制器中会更容易。

技巧似乎是 ActionController::Parameters.new,它创建了 Rails 接受的合法参数。希望这对某人有用。