gpt4 book ai didi

ruby-on-rails - ActiveRecord::ReadOnlyRecord 使用 ActiveAdmin 和 Friendly_id 时

转载 作者:行者123 更新时间:2023-12-04 11:09:02 26 4
gpt4 key购买 nike

我最近开始在一个项目中使用 ActiveAdmin,几乎所有东西都运行良好,但是在将它与friendly_id gem 结合使用时遇到了问题。由于其 ID 为只读的friendly_id 属性,我为我的表单抛出了 ActiveRecord::ReadOnlyRecord [我相信]:

{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=",
"space"=>{"name"=>"The Kosmonaut",
"address"=>"8 Sichovykh Striltsiv 24",
"email"=>"info@somedomain.com"},
"commit"=>"Update Space",
"id"=>"the-kosmonaut"} <--- culprit

我猜最后一行是罪魁祸首,因为它是只读属性,它不在我的表单中,而是在 PATH 中

http://localhost:5000/manage/spaces/the-kosmonaut/edit

如何通过尝试更新 ID 来解决此问题?

ActiveAdmin 中的表单如下所示:
  form do |f|
f.inputs "Details" do
f.input :name
f.input :address
f.input :email
f.input :phone
f.input :website
end
f.inputs "Content" do
f.input :description
f.input :blurb
end
f.buttons
end

更新:这也不起作用,所以它不是friendly_id?

我尝试使用@watson 的建议,该建议应该有效,但仍然出现相同的错误;-(
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"Rc5PmUYZt3BiLvfPQr8iCPPXlbfgjoe/n+NhCwXazNs=",
"space"=>{"name"=>"The Kosmonaut 23"},
"commit"=>"Update Space",
"id"=>"6933"}

http://localhost:5000/manage/spaces/6933/edit

当我使用 record.readonly 在控制台中检查记录时?它返回假

UPDATE UPDATE:删除 scope_to 解决了这个问题。
scope_to :current_user, :unless => proc{ current_user.admin? }

唯一的问题是我需要 scope_to 来防止用户看到他们不拥有的记录。我的猜测是(因为我假设 scope_to 通常与 has_many 一起使用)我的 HABTM 关联会导致一些奇怪的事情?即用户 <-- HABTM --> 空间?

最佳答案

如果您只想在前端使用友好 ID 而在 Active Admin 中不关心它们,您可以为您的 Active Admin Controller 恢复friendly_id gem 的效果。

我不知道 Friendly_id 如何覆盖 to_param方法,但如果它以正常方式执行,则在所有 Active Admin Controller 中重新覆盖它应该可以修复它,例如:

ActiveAdmin.register Foobar do
before_filter do
Foobar.class_eval do
def to_param
id.to_s
end
end
end
end

更好的是,您可以在基本 Active Admin Controller 中创建一个 before 过滤器 ActiveAdmin::ResourceController以便它自动继承到您的所有 Active Admin Controller 中。

首先将过滤器添加到 config/initializers/active_admin.rb设置:
ActiveAdmin.setup do |config|
# ...
config.before_filter :revert_friendly_id
end

开盘 ActiveAdmin::ResourceController并添加一个 revert_friendly_id方法,例如通过在 config/initializers/active_admin.rb 的末尾添加以下内容:
ActiveAdmin::ResourceController.class_eval do
protected

def revert_friendly_id
model_name = self.class.name.match(/::(.*)Controller$/)[1].singularize

# Will throw a NameError if the class does not exist
Module.const_get model_name

eval(model_name).class_eval do
def to_param
id.to_s
end
end
rescue NameError
end
end

更新:我刚刚更新了最后一个代码示例来处理没有相关模型的 Controller (例如 Active Admin Dashboard Controller )

更新 2:我只是尝试将上述 hack 与friendly_id gem 一起使用,它似乎工作得很好:)

更新 3:清理代码以使用在过滤器之前添加 Active Admin 到基本 Controller 的标准方式

关于ruby-on-rails - ActiveRecord::ReadOnlyRecord 使用 ActiveAdmin 和 Friendly_id 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com