【问题标题】:Getting the string from a rails pluck to display n从 rails pluck 获取字符串以显示 n
【发布时间】:2017-08-17 00:48:11
【问题描述】:

有一个超级快速的问题。我仍然是 Rails 新手,并尝试关注这两个问题,但它们对我不起作用:Why does Array.to_s return brackets?ruby 1.9 how to convert array to string without brackets

我正在尝试在我的聊天室应用程序中显示最后一条消息及其发送日期。我可以使用此代码获得结果,但它周围有括号,我想删除这些括号。这里的任何帮助都会很棒,我还附上了截图。非常感谢!

Show.html.erb

For the Date: <%= chatroom.messages.last(1).pluck(:created_at) %> For the Last Message in Chatroom: <%= chatroom.messages.last(1).pluck(:body) %>

DirectMessages 控制器

class DirectMessagesController < ApplicationController
before_action :authenticate_user!

def show
    users = [current_user, User.find(params[:id])]
    @messageduser = User.find(params[:id])
    @chatroom = Chatroom.direct_message_for_users(users)        
    @chatroomall = current_user.chatrooms
    @messages = @chatroom.messages.order(created_at: :desc).limit(100).reverse
    @messagelast = @chatroom.messages.last(1)
    last_message = @chatroom.messages.last
    render "chatrooms/show"
end
private

def chatroomuserlocator
    @chatroomlocator = Chatroom.find(params[:chatroom_id])
end
end

【问题讨论】:

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


    【解决方案1】:

    试试这个:

    <%= chatroom.messages.last.created_at %>
    

    还有这个:

    <%= chatroom.messages.last.body %>
    

    请记住,pluck 返回一个数组,这样可以解释你的括号。

    我认为您在这里不需要pluck,因为您只是在访问单个项目的属性。

    【讨论】:

    • 感谢@Dan 的回复和上下文,我尝试这样做得到了这个错误消息“undefined method `created_at' for nil:NilClass”
    • 最后一个使用“.try”的工作!谢谢十亿丹!
    • 没问题。我很高兴它有所帮助。我只是在这里更新我的评论,因为我有一个错字。如果要从消息数组中删除nil 元素,可以使用compact 方法,如下所示:&lt;%= chatroom.messages.compact.last.created_at %&gt;。如果返回错误,您的聊天室实例中可能没有任何消息。如果你只是想避免返回错误,你可以像这样使用try 方法:&lt;%= chatroom.messages.last.try(:created_at) %&gt;
    【解决方案2】:

    如果您不太担心内存使用情况,您可以获取整个对象并仅访问您想要的字段。

    <%= chatroom.messages.last.created_at %>
    <%= chatroom.messages.last.body %>
    

    【讨论】:

    • 感谢@urielSilva 的回复,我尝试这样做得到了这个错误消息“undefined method `created_at' for nil:NilClass”我也把我的控制器放在了以防万一。
    • 您可以使用控制器中使用的last_message 变量。只需确保在视图和控制器中的变量名称开头添加@
    【解决方案3】:

    您可以将查找分配给一个值,因此它不会运行两次:

    last_message = chatroom.messages.last

    然后你就可以高效地访问属性了:

    last_message.created_at
    last_message.body
    

    如果您有兴趣限制属性或last_message,请使用select

    last_message = chatroom.messages.select(:created_at, :body).last

    把它们放在一起:

    <% last_message = chatroom.messages.select(:created_at, :body).last %>
    <%= last_message.created_at %>
    <%= last_message.body %>
    

    【讨论】:

    • 谢谢@Brad 我试着按照你的建议去做。在我的 DirectMessages 控制器中添加了 last_message = @chatroom.messages.last。然后在我的显示视图文件中,我添加了行&lt;%= last_message.created_at %&gt; 我收到一条错误消息“未定义的局部变量或方法‘last_message’ for #:0x007fe33d6aae28>”
    • @Omar 您不会将其放在控制器中,而是将其保留在视图中,如所述的 erb 中。如果你想在控制器中使用它,你需要使用@last_message...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多