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 接受的合法参数。希望这对某人有用。
我有一些看起来很简单的代码,让我摸不着头脑。
这是一个用户模型:
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 接受的合法参数。希望这对某人有用。