首页 > 解决方案 > 使用设计 gem 的 Rails 用户到用户消息

问题描述

设计 gem 实现 sign_in 和 sign_out 正常工作。

出错

MessagesController#index 中的 NoMethodError

Message:Module 的未定义方法“relation_delegate_class”

[错误图像]

当我进入对话/1/消息时,对话/index.html.erb 页面阅读器正确

迁移/conversations.rb

  t.integer :sender_id
  t.integer :recipient_id

迁移/messages.rb

  t.text :body
  t.references :conversation, index: true
  t.references :user, index: true

模型/对话.rb

  belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
  belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'

  has_many :messages, dependent: :destroy
  validates_uniqueness_of :sender_id, :scope => :recipient_id

  scope :between, -> (sender_id,recipient_id) do
        where("(conversations.sender_id = ? AND conversations.recipient_id =?)
        OR (conversations.sender_id = ? AND conversations.recipient_id =?)",
        sender_id,recipient_id, recipient_id, sender_id)
  end

模型/消息.rb

  belongs_to :conversation
  belongs_to :user

  validates_presence_of :body, :conversation_id, :user_id

  def message_time
    created_at.strftime("%m/%d/%y at %l:%M %p")
  end

控制器/conversations_controller.rb

class ConversationsController < ApplicationController
  before_action :authenticate_user!

  def index
    @users = User.all
    @conversations = Conversation.all
  end

  def create
    if Conversation.between(params[:sender_id], params[:recipient_id]).present?
      @conversation = Conversation.between(params[:sender_id], params[:recipient_id]).first
    else
      @conversation = Conversation.create!(conversation_params)
    end
    redirect_to conversation_messages_path(@conversation)
  end

  private
  def conversation_params
    params.permit(:sender_id, :recipient_id)
  end
end

控制器/messages_controller.rb

class MessagesController < ApplicationController
  before_action do
    @conversation = Conversation.find(params[:conversation_id])
  end

  def index
    @messages = @conversation.messages
    @message = @conversation.messages.new
  end
  def new
    @message = @conversation.messages.new
  end

  def create
    @message = @conversation.messages.new(message_params)
    if @message.save
      redirect_to conversation_messages_path(@conversation)
    end
  end
  private
  def message_params
    params.require(:message).permit(:body, :user_id)
  end
end

意见/对话/index.html.erb

<style>
.glyphicon {
  float: right;
  margin-top: 2px;
  margin-right: -6px;
}
</style>
  <div class="list-group col-md-3">
  <ul class="nav nav-pills nav-stacked">
    <li><button type="button" class="list-group-item"
    data-toggle="collapse" data-target="#mail"><h4>Conversations
      <i class="glyphicon glyphicon-inbox"></i></h4></button></li>
    <li><button type="button" class="list-group-item"
    data-toggle="collapse" data-target="#new"><h4>New Message
      <i class="glyphicon glyphicon-new-window" style="vertical-align:right;"></i></h4></button></li>
  </ul>
</div>
<h1>My Inbox</h1>
<div class="panel panel-default">
<div class="col-lg-6">
  <div id="mail" class="collapse">
    <h1 class="panel-heading">All Conversations:</h1>
    <div class="panel-body">
     <div class="item">
      <% @conversations.each do |conversation| %>
      <% if conversation.sender_id == current_user.id || conversation.recipient_id == current_user.id %>
       <% if conversation.sender_id == current_user.id %>
         <% recipient = User.find(conversation.recipient_id) %>
       <% else %>
         <% recipient = User.find(conversation.sender_id) %>
       <% end %>
       <h3><%= link_to recipient.email, conversation_messages_path(conversation)%></h3>
      <% end %>
     <% end %>
     </div>
    </div>
   </div>
  <div id="new" class="collapse">
    <div class="panel-body">
     <h1 class="panel-heading">All Users:</h1>
       <% @users.each do |user| %>
        <% if user.id != current_user.id %>
         <div class="item"><h3>
      <%= link_to user.email,
       conversations_path(sender_id: current_user.id, recipient_id: user.id), method: "post"%>
     </h3></div>
      <% end %>
     <% end %>
    </div>
  </div>
</div>
</div>

视图/消息/index.html.erb

<style>
  .icon-flipped {
  transform: scaleX(-1);
  -moz-transform: scaleX(-1);
  -webkit-transform: scaleX(-1);
  -ms-transform: scaleX(-1);
  }
  .glyphicon.glyphicon-log-out {
    font-size: 20px;
}
</style>
<div class="panel panel-default">
<% if @over_5 %>
 <%= link_to 'Show All', '?m=all', class: 'btn btn-link pull-right' %>
<% end %>
<%= link_to '<i class="glyphicon glyphicon-log-out icon-flipped"></i>'.html_safe,
'/conversations', { :class => 'tooltips, btn btn-link', 'data-toggle' => 'tooltip',
   'data-placement' => 'right', :title => 'Back To Inbox' } %>
<script>
$(document).ready(function(){
    $('[data-toggle="tooltip"]').tooltip();
});
</script>
 <% @messages.each do |message| %>
  <% if message.body %>
   <% user = User.find(message.user_id) %>
   <div class="item">
<div class="panel-heading">
       <div class="header"><strong><%= user.email %> </strong><%= message.message_time %></div>
      <div class="list">
       <div class="item">
        <i class="right triangle icon"></i>
        <%= message.body %>
      </div>
    </div>
   </div>
 </div>
 <% end %>
<% end %>
</div>
</div>
<div class="col-md-10 col-md-offset-1">
<%= form_for [@conversation, @message] do |f| %>
<div class="form-group">
  <%= f.text_area :body, class: "form-control" %>
</div>
  <%= f.text_field :user_id, value: current_user.id, type: "hidden" %>
<div class="form-group">
  <%= f.submit "Send Reply", class: "form-control btn btn-primary" %>
</div>
<% end %>
</div>

标签: ruby-on-railsruby

解决方案


问题可能出@message = @conversation.messages.new在您的控制器上,应该是@message = Message.new(conversation: @conversation). 你试过吗?


推荐阅读