【发布时间】:2020-06-15 14:08:29
【问题描述】:
设计 gem 实现 sign_in 和 sign_out 正常工作。
遇到错误
MessagesController#index 中的 NoMethodError
Message:Module 的未定义方法“relation_delegate_class”
conversations/index.html.erb 页面阅读器在我进入对话/1/messages 时正确读取错误
迁移/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
models/conversation.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-rails ruby