ruby-on-rails - 使用设计 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>
解决方案
问题可能出@message = @conversation.messages.new
在您的控制器上,应该是@message = Message.new(conversation: @conversation)
. 你试过吗?
推荐阅读
- r - 如何有条件地处理 Rmarkdown 中的部分
- java - 如何在 Liferay MVC portlet 的 actionResponse 中设置 301 状态码
- jenkins-plugins - 在警告下一代插件中查看此版本的新警告
- linux - 重命名文件夹中多个文件的Linux命令错误
- javascript - 通过提交按钮输入到同一数组中的所有值的总和
- sql - 如果依赖于数据/行过滤,内部连接中的类型转换是否安全?
- android - 具有平滑滚动和页面转换的垂直 ViewPager,如 inshorts 应用程序
- sql - 如何在 Spring bean 中执行 PL/pgSQL 脚本?
- apache-spark - Spark 应用程序名称约定
- python - 在 python 中安装一些库时遇到问题(oauth2client 和 gspread)