我遇到了 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/