ruby-on-rails - 在 Rails 中使用结构

标签 ruby-on-rails ruby

我遇到了 this messaging tutorial最近,对 Struct.new 的使用很感兴趣。在谷歌和SO的帮助下我已经了解了更多关于 Struct 在 Ruby 中的使用,但我想了解更多关于它在 Rails 中的使用。在教程中,有一个文件夹模型,用于存储用户收到的消息:

class Folder < ActiveRecord::Base
  acts_as_tree
  belongs_to :user
  has_many :messages, :class_name => "MessageCopy"
end

“收件箱”文件夹在创建新用户时创建:

class User < ActiveRecord::Base
  has_many :sent_messages, :class_name => "Message", :foreign_key => "author_id"
  has_many :received_messages, :class_name => "MessageCopy", :foreign_key => "recipient_id"
  has_many :folders

  before_create :build_inbox

  def inbox
    folders.find_by_name("Inbox")
  end

  def build_inbox
    folders.build(:name => "Inbox")
  end
end

但是,“垃圾桶”文件夹是使用 Struct.new 即时创建的:

class MailboxController < ApplicationController

  def index
    @folder = current_user.inbox
    show
    render :action => "show"
  end

  def show
    @folder ||= current_user.folders.find(params[:id])
    @messages = @folder.messages.not_deleted
  end

  def trash
    @folder = Struct.new(:name, :user_id).new("Trash", current_user.id)
    @messages = current_user.received_messages.deleted
    render :action => "show"
  end
end

在 Rails 中使用 Struct 有什么好处?为什么在本教程中使用它来创建“垃圾箱”文件夹而不是“收件箱”文件夹(也可以在创建用户时构建)?感谢您的帮助,关于 Struct 何时可以/应该与 Rails 一起使用,我在网上还没有遇到太多!

最佳答案

没有任何好处,只是背后的某种推理:

  • 用户可以拥有文件夹。
  • 本例中的垃圾桶是一个虚拟文件夹,它包含所有已标记为已删除的邮件。

为了让您的观点适用于这两种情况,作者决定创建一个假文件夹对象(一个没有所有事件记录内容的对象,因此无法保存等)。然后他将其暴露给 View 。

<%= @folder.name %>

然后将工作,独立于该假文件夹还是真实文件夹。

关于ruby-on-rails - 在 Rails 中使用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626147/

相关文章:

ruby-on-rails - Rails 3 - 防止 form_for DOM 操作更改

ruby-on-rails - 当资源名称与模型/ Controller 名称不同时,Cancan 的 load_and_authorize_resource

ruby-on-rails - Heroku on Rails - 无效的 DATABASE_URL

ruby-on-rails - Rails - 如何设置创建操作来进行多个关联?

ruby-on-rails - 使用 OAuth-Ruby 和 Tumblr API 获取访问 token (Rails 3)

ruby-on-rails - 从参数中剥离破折号 - Rails

python - Ruby 或 Python 的 3d 游戏引擎?

ruby - #<EventManager :0x007fa4220320c8> (NoMethodError) 的未定义方法 `output_data'

ruby-on-rails - ruby /rails : Converting a range into a hash

ruby-on-rails - 网站如何根据URL更改连续播放标题中的音频