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