我在一对多关系之间创建嵌套对象时遇到一些困难。我的模特是艺术家和歌曲,艺术家可以有很多歌,一首歌必须属于艺术家。
我遇到的问题是创作艺术家和歌曲。对于用户体验,我希望用户在创建艺术家的同时创建艺术家的歌曲,因此我的Artist控制器如下所示:
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 %>
在我的Artist模型上,我目前正在验证名称的唯一性,我想继续这样做。我想弄清楚的是,找到一种方法,如果用户转到这种形式,已经存在具有该名称的艺术家,忽略保存艺术家,而不是像这样:
@artist = Artist.find_by_name(params[:artist_name])
@song = @artist.songs.new
为现有艺术家创作新歌。我现在可以通过添加链接和使用我的Song控制器/视图来完成此操作。我很困惑如何在没有用户输入的情况下做到这一点,并简单地构建歌曲。
如果艺术家姓名存在歌曲信息,我是否应该使用Javascript提交帖子请求?我也可以给控制器添加逻辑,但不知道如何根据控制器中的验证添加条件,这对我来说也很糟糕。有没有人有类似情况的经验?感谢帮助。
答案 0 :(得分:1)
你在这里挥舞着一把相当可怕的剑。在通过艺术家姓名进行验证时,您是否可以确定该歌曲可能不适用于同名的其他艺术家?因为如果您的项目很广泛,那么您将不可避免地要交叉数据。
我建议的是不要在事后检查 - 但是,当用户输入艺术家的名字时,使用jQuery自动完成插件,如http://jqueryui.com/demos/autocomplete/,以便用户可以选择该艺术家如果他们已经在那里了。
如果此人输入了艺术家的名字并且该艺术家确实存在(使用find_by_name就可以了),那么我会将它们重定向到一个中间页面,其中包含一条通知:“已经有一位艺术家具有该名称。这是你要找的艺术家吗?“以及数据库中找到的艺术家的一些基本信息。然后你可以有两个链接:一个说“是”并协助创作,另一个说“不,创造一个新艺术家”并从那里开始。
从我的角度来看,您应该可以使用rails完成所有这些操作,而不需要任何ajax发布。确保你正在观看从一页到另一页传递的参数。使用redirect
或render
更改。