Как использовать переменные экземпляра, определенные в контроллере, в представлении с ActiveAdmin? - PullRequest
7 голосов
/ 30 декабря 2011

У меня есть это:

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|, но есть более сложные вещи, для которых я использую это, и мне нужен доступ к объекту пользователя в контроллере.

Ответы [ 6 ]

27 голосов
/ 08 апреля 2015

На всякий случай, если кто-то еще наткнется на это:

controller.instance_variable_get(:@user)

тоже должно работать.

6 голосов
/ 18 января 2014

В активном администраторе есть контроллер, несмотря на это вы не можете передать переменную экземпляра в arbre part. Но вы можете использовать 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 голос
/ 07 февраля 2019

Переменные экземпляра определены как вспомогательные методы. Если у вас есть это определено в вашем контроллере, вы можете получить к нему доступ. Кроме того, вы можете просто вызвать 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
1 голос
/ 16 февраля 2012

Кажется, что не работает в activeadmin.Единственная переменная экземпляра, доступная внутри блока «form» - это @ config.

. Лучший способ решить эту проблему - использовать партиалы, как описано в разделе «Настройка формы»

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

0 голосов
/ 13 июля 2017

Если ваша цель - установить @user для шаблона действия show, делать это не обязательно, поскольку активный администратор уже делает это за вас.

Если вы используете 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
0 голосов
/ 04 ноября 2015

Не совсем уверен, как выбрать правильную переменную экземпляра в модели, но вы можете дать практически любое имя переменной экземпляра, я тестирую некоторые случаи, и кажется, что просто ищет тот, который имеет тот же тип модели, когдаВы не указываете это, чтобы ответить на другой вопрос, у вас есть много способов сделать это самым простым, просто с тем же именем, что и у вашей переменной экземпляра, в вашем случае,

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

и последний известный мне метод, у вас есть два сценария, один для ваших файлов active_admin (.rb)

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

или в пользовательских представлениях .arb, например форма дляcustom 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 имеет дело с переменными экземпляра, но по крайней мере у вас есть нескольковарианты, привет

...