Rails委托不按预期工作

时间:2011-06-29 16:51:44

标签: ruby-on-rails

我有以下课程:

class VideoChannel < ActiveRecord::Base

  #Associations
  belongs_to :video_playlist, :dependent => :destroy
  VideoChannel.video_playlist_name 

  delegate :name, :id, :list_type, :list_id, :manual, :to => :video_playlist, :prefix => true

  #validations
  validates_presence_of :name

  #After Functions
  def after_create
    video_playlist = VideoPlaylist.new(:name      => self.name,
                                       :list_type => "VideoChannel",
                                       :list_id   => self.id)
    video_playlist.save
  end

并且:

class VideoPlaylist < ActiveRecord::Base
  belongs_to  :list, :polymorphic => true

  has_many    :video_channels, :dependent => :destroy
  delegate :name, :id, :description, :to => :video_channel, :prefix => true

end

我正在尝试使用Rails委托功能在VideoChannel页面中创建一个链接,该链接允许我链接到视频播放列表并编辑其中的内容。因此,关联就在那里,您可以通过浏览播放列表部分来编辑播放列表,但我们希望将它们组合在一起。我似乎无法弄清楚这一点。我也是Rails的新手,仍在通过指南等工作。

编辑:这是视图代码

<%= link_to '<span class="pen icon"></span>Edit',
      content_url(:controller =>"video_playlists", :id => channel.video_playlist_id, :action => "edit"),
      :class => "button right" %>

以下是控制器的相关部分:

class VideoChannelsController < ApplicationController
  # GET /videochannels
  # GET /videochannels.xml
  def index

    @video_channels = VideoChannel.roots(:order => 'order_num')
    @video_channels_parents = @video_channels.group_by {:parent_id}
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @video_channels }
    end

  end

  # GET /videochannels/1
  # GET /videochannels/1.xml
  def show
    @video_channel = VideoChannel.find(params[:id], :order => 'order_num')

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @video_channel }
    end
  end

class VideoPlaylistsController < ApplicationController
  # GET /video_playlists
  # GET /video_playlists.xml
  def index
    if !params[:with].nil?
      @video_playlists = VideoPlaylist.find(:all, :conditions => {:list_type => 'VideoShow'})
    else
      @video_playlists = VideoPlaylist.find(:all, :conditions => {:list_type => 'Section'})
    end

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @video_playlists }
    end
  end

  # GET /video_playlists/1
  # GET /video_playlists/1.xml
  def show
    @video_playlist = VideoPlaylist.find(params[:id], :include => [{:video_video_playlists => :video}, {:videos => :asset}, {:videos => :content_image}])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @video_playlist }
    end
  end
end

1 个答案:

答案 0 :(得分:0)

该行在哪里

VideoChannel.video_playlist_name

来自?它在做什么?你也在类上调用一个方法而不是一个实例(有点像 - Ruby不是这样,但它足以解释)。

反正:

委托真的是为了避免像这样的大量火车残骸代码:

fred.jim.bill.xxx

你说他们彼此属于 - 这种关系看起来像是错误的方式。为什么要从孩子内部创建父母?你将如何拥有属于给定播放列表的许多视频频道?

我认为您需要查看构建和关系名称。为了解决你的模型可能会误解您的模型,我们可以切换到具有许多库存项目的产品:

class Product < ActiveRecord::Base
  has_many :stock_items
end

class StockItem < ActiveRecord::Base
  belongs_to :product
end

这意味着stock_item将包含product_id列。

所以,假设您正在创建一个类似的产品:

product.stock_items.build # :whatever the params are required

这会自动为您设置ID,这意味着您无需设置ID。然后,当你执行product.save时,它也会保存所有相关的库存项目。

在这个玩具模型的视图中,如果您正在显示其中一个库存商品,那么您将使用委托在视图中显示产品的名称,而不必丢失stock_item.product.name(例如)。

我希望这会有所帮助。