Ruby on rails Rails ActiveAdmin有一个并属于原因';未定义的方法<;多元资源>';
在Rails中,我有一个“用户”模型和一个“钱包”模型。“用户”有一个钱包,每个“钱包”属于“用户”。我在ActiveAdmin中创建了一个“显示”页面来查看用户的钱包。但是,转到该页会返回以下错误:Ruby on rails Rails ActiveAdmin有一个并属于原因';未定义的方法<;多元资源>';,ruby-on-rails,ruby,activerecord,activeadmin,Ruby On Rails,Ruby,Activerecord,Activeadmin,在Rails中,我有一个“用户”模型和一个“钱包”模型。“用户”有一个钱包,每个“钱包”属于“用户”。我在ActiveAdmin中创建了一个“显示”页面来查看用户的钱包。但是,转到该页会返回以下错误: undefined method `wallets' for #<User:0x007f...> 你知道我哪里出了问题吗 编辑1:更新以更正描述中的冒号放置错误 编辑2: 针对: 你能出示你的路由文件吗?另外,您能否向我们提供错误消息的完整回溯,并提供rake路由的输出?我怀疑它抱怨
undefined method `wallets' for #<User:0x007f...>
你知道我哪里出了问题吗
编辑1:更新以更正描述中的冒号放置错误
编辑2:
针对:
你能出示你的路由文件吗?另外,您能否向我们提供错误消息的完整回溯,并提供rake路由的输出?我怀疑它抱怨钱包没有被定义的原因(即使你在上面的代码中从未调用钱包)是因为一些路由正在对关系的外观进行假设4分钟前的Glyoko
- admin_user_wallets GET/admin/users/:user_id/wallets(:format)admin/wallets#index
- POST/admin/users/:用户id/钱包(:格式)管理员/钱包#创建
- new_admin_user_wallet GET/admin/users/:user_id/wallet/new(:format)admin/wallet#new
- 编辑_admin_user_wallet GET/admin/users/:user_id/wallet/:id/edit(:format)admin/wallet#edit
- 管理员\用户\钱包获取
/管理员/用户/:用户id/钱包/:id(:格式)管理员/钱包#显示 - 管理员用户钱包补丁/管理员/用户/:用户id/钱包/:id(:格式)管理员/钱包#更新
- admin_user_wallet PUT/admin/users/:user_id/wallet/:id(:format)admin/wallet#更新
即使您的路线可能没有明确引用钱包,也可能存在一些假设,即记录之间如何相互关联 查看
耙路由的输出,尤其是:
admin_user_wallet GET
/admin/users/:user_id/wallets/:id(.:format) admin/wallets#show
当您调用admin\u user\u wallet\u path(user,user.wallet.id)
时,它与/admin/users/:user\u id/wallet/:id(:format)
路径匹配。请注意,这在路径中同时需要用户id和钱包id。这是一个提示,说明这里有问题,因为如果你有用户,应该正好有一个钱包与之关联。您不需要同时提供用户和钱包id
由于钱包资源嵌套在用户下,因此查看用户钱包的页面实际上更像是索引页面,而不是显示页面。如果钱包是一个独立的资源,那么你可以有一个类似于/admin/wallets/:id
的路径,一切都会顺利进行
但是,由于钱包是用户的子资源,因此理想情况下,您需要像/admin/users/:user\u id/wallet
这样的路径。无需传递钱包id,因为您已经拥有该用户
tl;dr:试着将显示
s更改为索引
s,看看这会让你怎么样。e、 g
index do
div do
'hello'
end
end
# ...
action_item :wallet, only: :index do
link_to('Wallet', admin_user_wallets_path(user))
end
好的。。所以我有同样的问题。我有一个属于某个家长的,而该家长只有一个属于子模型的。。。。。似乎什么都不管用,所以我决定假装一下。我不确定这是否是最好的方法,但它奏效了。在父模型中,添加一个方法:
class User < ActiveRecord::Base
has_one :wallet
def wallets
Wallet.where(user_id: id)
end
end
class用户
上面的代码是一个修补程序,直到我可以找到其他方法来实现我所需要的。ActiveAdmin
在内部使用InheritedResources
gem,所属的方法在InheritedResources
内部结束
这里可能的解决方案
ActiveAdmin.register Wallet do
belongs_to :user, singleton: true
actions :all, except: :destroy
end
选项singleton:true
使Wallet
成为用户的单一资源
如果任何用户
都不需要钱包提供您可以显示您的路由文件吗?另外,您能否向我们提供错误消息的完整回溯,并向我们提供rake routes
的输出?我怀疑它抱怨钱包
没有定义的原因(即使你在上面的代码中从未调用钱包
)是因为一些路由正在对关系的外观进行假设。编辑以解决此评论^2(应用程序和框架)你能给出完整的回溯吗?我想大概有50行。routes.rb中是否有对ActiveAdmin方法的调用?如果下面的答案行得通的话,也许这是没有必要的,但我可以给出一个更好的答案,这实际上是对正在发生的事情的一个轻微简化。我对ActiveAdmin不太熟悉,但似乎有人假设(也许在框架中,也许在您的配置中?)嵌套的资源是多元的。在纯rails中,有一种方法可以嵌套单个资源,但这里似乎有一些东西排除了这一点。然而,这是一个相对干净的解决方法,对于大多数目的来说可能是可以接受的。不要假装,答案是single:true
class User < ActiveRecord::Base
has_one :wallet
def wallets
Wallet.where(user_id: id)
end
end
ActiveAdmin.register Wallet do
belongs_to :user, singleton: true
actions :all, except: :destroy
end