如何使用实例变量,在控制器中定义,与ActiveAdmin的看法?

问题描述 投票:6回答:6

我有这个:

ActiveAdmin.register User do
  controller do
    def show
      @user = User.find(params[:id])
      show! 
    end
  end

  show do
    attributes_table do
      row "User" do
        link_to @user.display_name, user_path(@user.slug) 
      end
    end
  end
end

但是,当我加载页面,我得到一个错误说:

undefined method `display_name' for nil:NilClass

这意味着@user为零。我肯定@user设置适当(意味着取景器越来越存在于数据库适当的数据)。我想它与ActiveAdmin是如何工作的,我很熟悉的东西。有什么想法吗?

另外,我知道我能做到show do |user|,但也有我用这并需要访问用户对象的控制更复杂的东西。

ruby-on-rails activeadmin
6个回答
1
投票

这似乎不工作在activeadmin的方式。唯一的实例变量可用内部“表”块是@config。

解决这个问题的最佳方法是使用谐音为“自定义表”中所描述

http://activeadmin.info/docs/5-forms.html


27
投票

万一别人绊倒在此:

controller.instance_variable_get(:@user)

应该正常工作。


6
投票

有控制器在主动管理,尽管这样,你不能传递实例变量ARBRE一部分。但是你可以使用这个params哈希:

ActiveAdmin.register User do
  controller do
    def show
      params[:user] = User.find(params[:id])
      show! 
    end
  end

  show do
    attributes_table do
      row "User" do
        link_to params[:user].display_name, user_path(params[:user].slug) 
      end
    end
  end
end

P.S:如果你不想改变params,那么所有的实例变量都存储在@arbre_context.assigns。你也可以做这样的:

link_to @arbre_context.assigns[:user].display_name, user_path(@arbre_context.assigns[:user].slug) 

1
投票

实例变量被定义为辅助方法。如果你有一个在你的控制器定义,你可以访问它。或者,你可以简单地调用resource,这将有参考活动记录对象。

ActiveAdmin.register User do
  controller do
    def show
      @user = User.find(params[:id])
      show! 
    end
  end

  show do
    attributes_table do
      row "User" do
        # note that your have access to `user` as a method.
        link_to user.display_name, user_path(user.slug) 
      end
    end
  end
end

0
投票

不完全知道如何选择模型上的正确的实例变量,但是,你可以实例变量给几乎任何名字,我测试某些情况下,它似乎只是看起来,因为当你穿上”是富人同一型号的一个牛逼指定它,回答您的其他问题,你有很多方法可以做到这一点的simples之一,只是名称相同的实例变量,你的情况,

row :attr do
     link_to user.display_name, admin_user_path(user)
end    

在你有

row :attr do |any_name|
    link_to any_name.display_name, admin_user_path(any_name)
end

最后的方法,我知道,你有两个escenarios,一个为你active_admin文件(.RB)

#eg: admin/user.rb
@arbre_context.assigns[:user]

或定制.arb视图,像自定义collection_action形式(相同的,但直接访问)

assigns[:user]

例如:

#views/admin/users/new_invitation.html.arb(arbre) or html.erb
active_admin_form_for assigns[:user], :url => send_invitation_admin_users_path do |user|
....
end
form_for assigns[:user], :url => send_invitation_admin_users_path do |user|
....
end
semantic_form_for assigns[:user], :url => send_invitation_admin_users_path do |user|
.....

就像我说的,我不知道怎么用active_admin实例变量的交易,但至少你有多种选择,问候


0
投票

如果你的目标是建立@usershow动作模板,它没有必要这么做,因为主动管理已经在做这个给你。

如果使用member_action,该@user对象是有你,这就是所谓的resource

您可以在resource定义一个单身方法,将可在视图中。这可能会在某些情况下是有意义的。

这是另一种方式,从控制器向视图传递信息。

member_action :show, method: :get do 
    resource.instance_eval do
        define_singleton_method('language') do
            'English'
        end
    end
end

show do
    attributes_table do
        row :name
        row :email
        row :id
        row :language
    end
end
© www.soinside.com 2019 - 2024. All rights reserved.