RoR - Показать страницу без имени пользователя - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь привести список пользователей, для которых был принят «запрос» для выбора пользователем. Я настроил коллекцию, и на странице просмотра отображается либо идентификатор пользователя, когда я вставляю :user_id, либо его показы <User:0x007fbdrf252a60>, когда я вставляю user. Я попытался вставить :name, но он возвращает ошибку «неопределенное имя метода».

В настоящее время моя форма выглядит так:

<%= form_for :event_logs, url: event_logs_path do |f| %>
  <%= f.select :user_id, options_from_collection_for_select(@user_event_log, :id, :name ) %>
  <%= f.hidden_field :event_id, :value => @event.id %>
  <%= f.submit 'Send', class: 'btn btn-success' %>
<% end %>

А в контроллере для шоу его:

@user_event_log = RequestLog.usr_req_by current_user

user_req_by в модели: scope :usr_req_by, ->(user) { where(user_id: user.id) }

Если понадобится больше информации, я буду рад добавить ее. Спасибо

Модель пользователя:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable

  validates_presence_of :name
  has_many  :request_logs, dependent: :destroy

  acts_as_messageable

  def first_name
    self.name.split.first
  end

  def last_name
    self.name.split.last
  end
end

Модель журнала запросов:

class RequestLog < ApplicationRecord

  enum status: { accepted: 0, rejected: 1 }

  belongs_to :user, optional: true
  belongs_to :request, optional: true

  validates :user_id, presence: true
  validates :request_id, presence: true

  scope :usr_req_by, ->(user) { where(user_id: user.id) }

  scope :req_itp, ->(requests) { where(request_id: requests) }


end

1 Ответ

0 голосов
/ 09 января 2019

Повторная коллекция, это коллекция RequestLog. Поэтому, когда вы используете :name в options_from_collection_for_select, он пытается вызвать .name на RequestLog.

Полагаю, вы хотите, чтобы имя пользователя там было? Если это так, вы можете добавить вспомогательный метод к RequestLog

def user_name
  return user.name
end

и используйте: user_name в представлении.

Другой вариант - передать объект, который отвечает на .call в качестве параметра, например:

<%= form_for :event_logs, url: event_logs_path do |f| %>
  <%= f.select :user_id, options_from_collection_for_select(@user_event_log, :id, ->(log){ log.user.name }) %>
  <%= f.hidden_field :event_id, :value => @event.id %>
  <%= f.submit 'Send', class: 'btn btn-success' %>
<% end %>

Я не пробовал это, но я посмотрел на источник для options_from_collection_for_select, который использует value_for_collection под капотом; Определяется как

def value_for_collection(item, value)
  value.respond_to?(:call) ? value.call(item) : public_or_deprecated_send(item, value)
end

(См. Исходный код Rails и apidock.com )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...