Ruby on rails 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路由的输出?我怀疑它抱怨

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

undefined method `wallets' for #<User:0x007f...>
你知道我哪里出了问题吗

编辑1:更新以更正描述中的冒号放置错误

编辑2:

针对:


你能出示你的路由文件吗?另外,您能否向我们提供错误消息的完整回溯,并提供rake路由的输出?我怀疑它抱怨钱包没有被定义的原因(即使你在上面的代码中从未调用钱包)是因为一些路由正在对关系的外观进行假设4分钟前的Glyoko

  • 我的路线文件没有提到“钱包”或“钱包”
  • 我的堆栈错误具体如下所示:

    activemodel(4.1.15)lib/active_model/attribute_methods.rb,第435行

    如果你需要更多,请告诉我

  • 以下是“bin/rake路由”的相关输出:

    • 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