【问题标题】:Creating Inbox/Outbox Pages创建收件箱/发件箱页面
【发布时间】:2014-09-19 09:22:35
【问题描述】:

为新手问题道歉,但我现在正在为我的网络应用程序开发消息功能,并尝试将收到的消息与发送的消息分开。有点像收件箱/发件箱。是否可以为发送的消息和接收的消息创建单独的索引页面?如果有人做过这样的事情,我将非常感谢您提供的任何指导。我的代码在下面,谢谢!:

routes.rb:

Application.routes.draw do

  devise_for :users, :controllers => { :registrations => "registrations" }

  devise_scope :user do
    get 'register', to: 'devise/registrations#new'
    get 'login',    to: 'devise/sessions#new',     as: :login
    get 'logout',   to: 'devise/sessions#destroy', as: :logout
  end

  resources :users do
    member do
     get 'edit_profile'
   end
  resources :messages, only: [:new, :create]
  end

  resources :messages

  root to: "home#index"
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get' 
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/legal',   to: 'static_pages#legal',   via: 'get'

end

messages_controller.rb

class MessagesController < ApplicationController

  def index
    @messages = current_user.to_messages
  end

  def show
    @message = current_user.to_messages.find params[:id]
  end

  def new
    @message = Message.new
    @recipient = User.find(params[:user_id])
  end

  def create
    @message = Message.new message_params
    @message.sender_id = current_user.id
    if @message.save
      flash[:success] = "Your message has been sent!"
      redirect_to users_path
    else
      flash[:failure] = "Please try again."
      redirect_to users_path
    end
  end

  def destroy
    @message = Message.find(params[:id])
    @message.destroy
    redirect_to messages_path
  end

  private

  def message_params
    params.require(:message).permit(:content, :sender_id, :recipient_id)
  end

end

messages.rb

class Message < ActiveRecord::Base
  belongs_to :sender, class_name: 'User', foreign_key: 'recipient_id'
  belongs_to :recipient, class_name: 'User', foreign_key: 'sender_id'

  validates :content, presence: true, length: { maximum: 500 }
  validates :sender_id, presence: true
  validates :recipient_id, presence: true

  attr_accessible :sender_id, :recipient_id, :content
end

【问题讨论】:

    标签: ruby-on-rails messages inbox


    【解决方案1】:

    消息

    不要创建不同的“索引”视图 - 只需为 messages 控制器创建 inboxoutbox 视图:

    #config/routes.rb
    resources :users do
       resources :messages
    end
    
    resources :messages do 
         get :sent, action: "index", type: "sent", on: :collection #-> domain.com/messages/sent
    end
    

    这将使您能够创建以下内容:

    #app/models/user.rb
    class User < ActiveRecord::Base
       has_many :to_messages ...
       has_many :from_messages ...
    end
    
    #app/controllers/messages_controller.rb
    class MessagesController < ApplicationController
       def inbox
           type = (params[:type] && params[:type] == "sent") ? "from_messages" : "to_messages"
           @messages = current_user.send(type)
       end
    end
    

    这将使您能够使用以下 URL 访问“收件箱”和“发件箱”路由:

    domain.com/messages #-> messages#index
    domain.com/messages/sent #-> messages#index(type=sent) 
    

    我估计您已经验证了User 模型(即您在访问它时将被验证)。不同之处在于您从模型中检索的数据——如果您访问sent 路由,您将能够访问“来自”消息,而如果您访问标准“索引”,它应该只显示一个to_messages的“收件箱”


    协会

    您要实现的最重要的方面之一是您如何存储/访问来自 Message 模型的数据。

    毫无疑问,您将有办法管理邮件“发件人”和“收件人”。这种数据分配将决定您如何访问所需的数据。

    我会使用以下内容:

    #app/models/user.rb
    class User < ActiveRecord::Base
       has_many :to_messages #-> messages with user_id" 
       has_many :from_messages #-> messages with "from_id"
    end
    

    如果您使用有关 User 关联的信息更新您的问题 - 它会给我一些更好的信息来处理,从而让我给您一个更有条理的答复!

    【讨论】:

    • 不知道resourceful route是否应该有inbox的action而不是index,即get :sent, action: "inbox", type: "sent", on: :collection
    • 感谢两位的帮助。这非常容易理解。对接,你是完全正确的。现在,有没有办法让我发送和接收的电子邮件有单独的显示视图?按照您建议的方式设置发送的消息后,当我实际单击消息查看它时,我收到以下错误:找不到带有 'id'=5 [WHERE "messages"."recipient_id" = 的消息?] "def show @message = current_user.to_messages.find params[:id]",但是当我点击收到的消息时,我可以很好地看到它们。这需要 if/else 语句吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多