在Rails中,我有一个“用户”模型和一个“钱包”模型。一个‘用户’has_one钱包,每个‘钱包’belongs_to一个‘用户’。我在ActiveAdmin中创建了一个“显示”页面来查看用户的钱包。但是,转到该页面将返回以下错误:
undefined method `wallets' for #<User:0x007f...>但是,当我将用户模型更新为“has_many:钱包”而不是“:has_one钱包”时,一切都正常。下面是来自我的模型和ActiveAdmin代码的相关代码:
型号:
class User < ActiveRecord::Base
has_one :wallet, dependent: :destroy
end
class Wallet < ActiveRecord::Base
belongs_to :user
endActiveAdmin:
ActiveAdmin.register Wallet do
belongs_to :user
actions :all, except: :destroy
show do
div do
'hello'
end
end
end
ActiveAdmin.register User do
actions :all, except: :destroy
permit_params
action_item :wallet, only: :show do
link_to('Wallet', admin_user_wallet_path(user, user.wallet.id))
end
index do...
end对我哪里出了问题有什么想法吗?
编辑1:更新以纠正描述中的冒号放置错误
编辑2:
针对以下情况:
你能给我看看你的路线文件吗?另外,你能告诉我们错误信息的全部回溯以及rake路由的输出吗?我怀疑它抱怨钱包没有被定义的原因(尽管你从来没有在上面的代码中调用钱包)是因为一些路由正在对关系的外观进行假设。-4分钟前
- admin\_user\_wallets GET /admin/users/:user\_id/wallets(.:format) admin/wallets#index
- POST /admin/users/:user\_id/wallets(.:format) admin/wallets#create
- new\_admin\_user\_wallet GET /admin/users/:user\_id/wallets/new(.:format) admin/wallets#new
- edit\_admin\_user\_wallet GET /admin/users/:user\_id/wallets/:id/edit(.:format) admin/wallets#edit
- admin\_user\_wallet GET/admin/user/:user_id/wallets/:id(.:format)admin/wallet#show
- admin_user_wallet补丁/管理/用户/:user_id/wallet/:id(.:format)admin/wallet#update
- admin_user_wallet PUT /admin/user/:user_id/wallet/:id(.:format)admin/wallet#update
发布于 2019-07-04 08:32:44
ActiveAdmin在内部使用InheritedResources gem,belongs_to方法在InheritedResources中结束。
这里可能的解决方案
ActiveAdmin.register Wallet do
belongs_to :user, singleton: true
actions :all, except: :destroy
end选项singleton: true使Wallet成为User的单一资源。
也许,如果钱包不需要任何optional: true来呈现,另一种选择User可能会有所帮助。
发布于 2017-03-01 00:06:43
即使您的路由可能没有显式地引用wallet(s),但可能有一些关于记录如何相互关联的假设。
查看rake routes的输出,特别是:
admin_user_wallet GET
/admin/users/:user_id/wallets/:id(.:format) admin/wallets#show当您调用admin_user_wallet_path(user, user.wallet.id)时,它将匹配/admin/users/:user_id/wallets/:id(.:format)路由。请注意路径中的用户id和钱包id是如何被期望的。这是一个提示,什么东西是在这里关闭,因为如果你有用户,应该有一个钱包与它有关。你不应该同时给用户和钱包的id。
因为钱包资源嵌套在用户下面,所以查看用户钱包的页面实际上更像是索引页而不是显示页。如果钱包是一个独立的资源,那么您可以有一条像/admin/wallets/:id这样的路径,一切都会好起来的。
但是,由于钱包是用户的子资源,所以理想情况下,您需要像/admin/users/:user_id/wallet这样的路径。没有必要传递钱包的id,因为你已经有了用户。
tl;dr:尝试将shows更改为indexs,看看这会给您带来什么结果。例如:
index do
div do
'hello'
end
end
# ...
action_item :wallet, only: :index do
link_to('Wallet', admin_user_wallets_path(user))
end发布于 2018-01-08 19:47:55
好的..。所以我也有同样的问题。我有一个belongs_to,父母只有一个has_one给孩子模型……似乎什么都没起作用,所以我决定假装。我不知道这是否是最好的办法,但它是有效的。在父模型中,添加一个方法:
class User < ActiveRecord::Base
has_one :wallet
def wallets
Wallet.where(user_id: id)
end
end上面的代码是一个修补程序,直到我找到其他方法来实现我所需要的。
https://stackoverflow.com/questions/42520412
复制相似问题