2010-07-05 20 views
0

艺术家有很多活动。活动有许多艺术家。这两个模型之间的连接称为表演。find_or_create_by_name with has_many:through

我试图与事件活动艺术家添加/编辑页面相关联。我希望只有在艺术家不存在的情况下才能添加艺术家,并且无论如何创建联合(表演)。艺术家只能与一个事件关联一次。

有人建议我用find_or_create_by_name代替accepts_nested_attributes_for的。

我下面的自动完成Railscasts#102指令称使用虚拟属性。我甚至没有得到自动完成的部分,只是试图让find_or_create_by_name工作。

我得到“未定义的方法`这位演出”为#”上的事件编辑和新的页面。在Railscast中,Ryan在将方法添加到模型之前获得了未定义的方法。但是我有模型中的方法。

不知道该怎么做。

event.rb

validates_presence_of :name, :location 
validates_uniqueness_of :name 

validates_associated :performances 

has_many :performances, :dependent => :delete_all 
has_many :artists, :through => :performances 

#accepts_nested_attributes_for :artists, :reject_if => proc {|a| a['name'].blank?}, :allow_destroy => true 

def artist_name 
    artist.name if artist 
end 

def artist_name=(name) 
    self.artist = Artist.find_by_name(name) unless name.blank? 
end 

artist.rb

validates_presence_of :name 

has_many :mixes 

has_many :performances, :dependent => :delete_all 
has_many :events, :through => :performances 

perfomance.rb

belongs_to :artist 
belongs_to :event 

events_controller.rb

def create 
    @event = Event.new(params[:event]) 

    respond_to do |format| 
    if @event.save 
     flash[:notice] = 'Event was successfully created.' 
     format.html { redirect_to(admin_events_url) } 
     format.xml { render :xml => @event, :status => :created, :location => @event } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @event.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

_form.html.erb

<% form_for([:admin,@event]) do |f| %> 
<p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
</p> 
<p> 
    <%= f.label :location %><br/> 
    <%= f.text_field :location %> 
</p> 
<p> 
    <%= f.label :date %><br /> 
    <%= f.date_select :date %> 
</p> 
<p> 
    <%= f.label :description %><br /> 
    <%= f.text_area :description %> 
</p> 
<% f.fields_for :artists do |builder| %> 
    <%= render 'artist_fields', :f => builder %> 
<% end %> 
<p><%= link_to_add_fields "Add Artist", f, :artists %></p> 
<p> 
    <%= f.submit 'Submit' %> <%= link_to 'Cancel', admin_events_path %> 
</p> 
<% end %> 

_artist_fields.html.erb

<p class="fields"> 
<%= f.label :artist_name, "Artist"%><br/> 
<%= f.text_field :artist_name %> 
<%= link_to_remove_fields "remove", f %> 
</p> 
+0

这不是从您提供的'artist_fields.html.erb'怎么是你的代码片段清晰设置表单构建器实例(由f表示)。你应该有类似 '<%form_for @event do | f | %> ... <% end %>'分隔这些。那是对的吗? – bjg 2010-07-05 21:11:09

+0

_artist_fields.html.rb是一个部分。 form_for在_form.html.rb中 – shalako 2010-07-06 04:33:21

回答

0

个人而言,我会回到accepts_nested_attributes_for,瑞安贝茨方法有嵌套属性以前的日子。

在你的控制器做这样的事情:

def new 
    @event = Event.find params[:id] 
    @artist = @event.artists.build 


def edit 
    @event = Event.find params[:event_id] 
    @artist = @event.artists.find params[:user_id] 

虽然在视图

... 
<% f.fields_for :artists, @artist do |builder| %>  
... 
相关问题