Ruby on rails 创建嵌套对象-如果唯一,则忽略保存,但仍生成子对象

Ruby on rails 创建嵌套对象-如果唯一,则忽略保存,但仍生成子对象,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我在一对多关系中创建嵌套对象时遇到一些困难。我的模特是艺术家和歌曲,一个艺术家可以有很多歌曲,一首歌曲必须属于一个艺术家 我遇到的问题是创作艺术家和歌曲。对于用户体验,我希望用户在创建艺术家的同时创建艺术家的歌曲,因此我的艺术家控制器如下所示: def new @artist = Artist.new @artist.songs.build end def create @artist = Artist.new(params[:artist]) if

我在一对多关系中创建嵌套对象时遇到一些困难。我的模特是艺术家和歌曲,一个艺术家可以有很多歌曲,一首歌曲必须属于一个艺术家

我遇到的问题是创作艺术家和歌曲。对于用户体验,我希望用户在创建艺术家的同时创建艺术家的歌曲,因此我的艺术家控制器如下所示:

def new
    @artist = Artist.new
    @artist.songs.build
  end

  def create
    @artist = Artist.new(params[:artist])

    if @artist.save
      redirect_to root_path
    else
      render :action => 'new'
    end
  end
然后是表格:

<div>
    <%= f.label :name, "Artist" %>
    <%= f.text_field :name %>
  </div>  

  <%= f.fields_for :songs do |song| %>
  <div>
    <%= song.label :title, "Song" %>
    <%= song.text_field :title %>
  </div>
  <% end %>
为现有艺术家创作新歌的地方。我现在可以通过添加链接和使用我的歌曲控制器/视图来实现这一点。我很困惑,如果没有用户输入,我怎么能做到这一点,而只是简单地构建歌曲


如果歌手姓名与歌曲信息一起存在,我是否应该使用Javascript提交post请求?我也可以向控制器添加逻辑,但不知道如何在控制器中添加基于验证的条件,这对我来说也很糟糕。有没有人有过类似的经历?感谢您的帮助。

您正在挥舞一把相当可怕的剑,这里。当通过艺术家姓名进行验证时,您是否可以确保歌曲可能不是针对同名的其他艺术家?因为如果你的项目涉及面很广,那么你不可避免地要交叉连接数据

我建议不要事后检查,而是在用户输入艺术家的名字时,使用jQuery自动完成插件,这样用户就可以选择已经存在的艺术家

如果这个人输入了一个艺术家的名字,而这个艺术家确实已经存在(使用find_by_name就可以了),那么我会将他们重定向到一个中间页面,上面会有一个通知:“已经有一个艺术家有这个名字了。这就是你要找的艺术家吗?”其中包含了数据库中找到的艺术家的一些基本信息。然后你可以有两个链接:一个说“是”并协助创作,另一个说“不,创建一个新的艺术家”并从那里开始

在我看来,您应该能够使用rails完成所有这些,而不需要任何ajax发布。确保您正在监视参数从一页传递到另一页。使用
重定向
渲染
可更改该属性

@artist = Artist.find_by_name(params[:artist_name])
 @song = @artist.songs.new