首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActiveAdmin has_one和belongs_to导致“<PLURAL_RESOURCE>的未定义方法”

Rails ActiveAdmin has_one和belongs_to导致“<PLURAL_RESOURCE>的未定义方法”
EN

Stack Overflow用户
提问于 2017-02-28 23:05:30
回答 3查看 1.4K关注 0票数 2

在Rails中,我有一个“用户”模型和一个“钱包”模型。一个‘用户’has_one钱包,每个‘钱包’belongs_to一个‘用户’。我在ActiveAdmin中创建了一个“显示”页面来查看用户的钱包。但是,转到该页面将返回以下错误:

代码语言:javascript
复制
undefined method `wallets' for #<User:0x007f...>

但是,当我将用户模型更新为“has_many:钱包”而不是“:has_one钱包”时,一切都正常。下面是来自我的模型和ActiveAdmin代码的相关代码:

型号:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_one :wallet, dependent: :destroy
end


class Wallet < ActiveRecord::Base
  belongs_to :user
end

ActiveAdmin:

代码语言:javascript
复制
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分钟前

  1. 我的路线文件没有提到‘钱包’或‘钱包’。
  2. 更具体地说,我的堆栈错误如下所示: activemodel (4.1.15) lib/active_model/attribute_methods.rb,第435行 如果你还需要更多的话请告诉我。
  3. 以下是“bin/rake路由”的相关输出:
代码语言:javascript
复制
- 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

EN

回答 3

Stack Overflow用户

发布于 2019-07-04 08:32:44

ActiveAdmin在内部使用InheritedResources gem,belongs_to方法在InheritedResources中结束。

这里可能的解决方案

代码语言:javascript
复制
ActiveAdmin.register Wallet do
  belongs_to :user, singleton: true
  actions :all, except: :destroy
end

选项singleton: true使Wallet成为User的单一资源。

也许,如果钱包不需要任何optional: true来呈现,另一种选择User可能会有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2017-03-01 00:06:43

即使您的路由可能没有显式地引用wallet(s),但可能有一些关于记录如何相互关联的假设。

查看rake routes的输出,特别是:

代码语言:javascript
复制
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,看看这会给您带来什么结果。例如:

代码语言:javascript
复制
index do
  div do
    'hello'
  end
end

# ...

action_item :wallet, only: :index do
  link_to('Wallet', admin_user_wallets_path(user))
end
票数 0
EN

Stack Overflow用户

发布于 2018-01-08 19:47:55

好的..。所以我也有同样的问题。我有一个belongs_to,父母只有一个has_one给孩子模型……似乎什么都没起作用,所以我决定假装。我不知道这是否是最好的办法,但它是有效的。在父模型中,添加一个方法:

代码语言:javascript
复制
class User < ActiveRecord::Base
   has_one :wallet
   def wallets
     Wallet.where(user_id: id)
    end
  end

上面的代码是一个修补程序,直到我找到其他方法来实现我所需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42520412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档