【问题标题】:Append ruby partial in javascript, and pass a rails variable在javascript中附加ruby部分,并传递一个rails变量
【发布时间】:2017-06-10 02:29:04
【问题描述】:

在 Rails5 中使用 ActionCable 创建聊天组件。我今天了解到,即使在 .js.erb 中,渲染部分也不会起作用。 render 特别是问题所在。所以现在我试图调用一个部分,并将一个 ruby​​ 变量传递给它。

我尝试了很多事情,目前这就是我正在尝试完成的方式:

chatbox.append(<%= j (Erubis::Eruby.new(File.read(File.join(Rails.root, 'app/views/msgs',
        '_msg.html.erb'))).result(msg: @msg)) %>);

错误是

 undefined method `self_or_other' for #<Erubis::Eruby:0x007f832bbb8590>

所以部分存在,但变量不正确。


views/msgs/_msg.html.erb

<li class="<%=  self_or_other(msg) %>">
  <div class="avatar">
    <%# if msg_interlocutor(msg).avatar.url(:thumb) == "thumb/missing.png" %>
    <%= image_tag(msg_interlocutor(msg).avatar.url(:thumb), class: "convoPic")%>
</div>
</li>

我也试过了:

chatbox.append(<%= j (Msg.new(File.read(File.join(Rails.root, 'app/views/msgs',
        '_msg.html.erb'))).result(msg: @msg)) %>);

并得到这个错误: When assigning attributes, you must pass a hash as an argument.

尝试渲染:

App.msgs = App.cable.subscriptions.create('MsgsChannel', {  
  received: function(data) {
    var chatbox = "#chatbox_" + data.convo + " .chatboxcontent"
    var id = data.convo;
    var sender_id = data.user.id;
    var reciever_id = data.receiver;
    <%= @msg %> = data.msg
    $(chatbox).append("<%= escape_javascript render(:partial => 'msgs/msg', :locals => { :msg => @msg }) %>");

    chatbox.scrollTop(chatbox[0].scrollHeight);
  },
  renderMsg: function(data) {
    console.log(data)
  }
});

我收到错误:

undefined method `render' for #<#<Class:0x007fe976b5c180>:0x007fe9773ed470>

我如何正确调用部分,将它传递给 ruby​​ 变量(带有 msg 记录)。谢谢!!

【问题讨论】:

  • 渲染部分应该可以工作。 chatbox.append("&lt;%= j render(:partial =&gt; 'msgs/msg') %&gt;");
  • 这个错误是在讨论 msg 变量以外的东西。另外,您不需要以这种方式传递变量,您可以尝试传递binding,然后从部分(共享)访问实例变量
  • @HoMan 它不起作用。你知道另一种方法吗?
  • 你为什么使用这个 erubis eruby 方法而不是 rails 标准渲染?
  • &lt;%= @msg %&gt; = data.msg 这是行不通的,因为只有在服务器发送页面并且 Javascript 在浏览器上持续运行时才会评估 ERB。

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


【解决方案1】:

您是否有包含以下内容的“messages_helper.rb”文件

module MessagesHelper
  def self_or_other(message)
    message.user == current_user ? "self" : "other"
  end

  def message_interlocutor(message)
    message.user == message.conversation.sender ? message.conversation.sender : message.conversation.recipient
  end
end

这是定义它的地方。

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 2013-01-16
    • 2013-07-05
    • 2013-10-04
    • 1970-01-01
    • 2014-08-14
    • 2016-05-08
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多