如何在ActiveAdmin视图中使用控制器中定义的实例变量?

我有这个:

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| ,但是我使用它有更复杂的东西,需要访问控制器中的用户对象。

似乎在activeadmin中不起作用。 “form”块中唯一可用的实例变量是@config。

解决此问题的最佳方法是使用“自定义表单”中所述的部分

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

以防万一其他人偶然发现:

 controller.instance_variable_get(:@user) 

也应该工作。

在主动管理中有控制器,尽管如此,你无法将实例变量传递给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 

PS:如果您不想更改params ,则所有实例变量都存储在@arbre_context.assigns 。 您可能也喜欢:

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

不完全确定如何在模型上选择正确的实例变量,但是,您可以为实例变量提供几乎任何名称,我测试一些情况,看起来只是在您不知道时查找具有相同模型类型的那个t指定它,为了回答你的另一个问题,你有很多方法可以做到简单的一个,就像你的实例变量一样,在你的情况下,

 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如何处理实例变量,但至少你有多个选项,问候

如果您的目标是为show action模板设置@user ,则没有必要这样做,因为活动管理员已经为您执行此操作。

如果使用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