RoR-显示页面未显示用户名

时间:2019-01-09 00:18:09

标签: ruby-on-rails ruby ruby-on-rails-5

我正在尝试提供已接受“请求”的用户列表,供用户选择。我设置了集合,并且在视图页面上显示的是输入:user_id时的用户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 :(得分:0)

经过迭代的集合是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 Source Codeapidock.com