创建依赖模型的新实例

时间:2016-01-04 09:50:22

标签: ruby-on-rails

我正在调整“入门”教程并尝试创建依赖模型的实例。

我的模特是博物馆和展览(教程中的文章和评论)。

本教程讲述了如何在Artcicle#show ERB文件中创建Comment实例。这可以通过使用以下表单帮助程序来实现:

<%= form_for([@article, @article.comments.build]) do |f| %>

我猜这个表单帮助器允许表单访问文章ID,因此允许准确的依赖。

我已经设法用自己的模特博物馆和展览来做到这一点。

虽然我希望能够创建一个展览实例,而不是位于博物馆#Exp ERB文件。但直接在展览#New ERB文件中。

我已经意识到最初没有这样做的路线,然后宣布展览作为一个适当的资源,除了依赖博物馆。 现在我的路线文件:

resources :exhibitions

resources :museums

resources :museums do
   resources :exhibitions
end

已创建适当的路线。

虽然我正在努力展览#New控制器和ERB文件。

直观地说,我知道我需要传递所有博物馆实例ID和名称的列表,以便用户可以选择展览所属的博物馆。

但到目前为止,我创建表单助手的所有尝试都失败了。我的最后一次尝试是这样的:

<%= form_for([@museum, @museum.exhibitions.build]) do |f| %>

<p>

  <%= f.select @museum.id, options_for_select(@museum.name) %>     </p>
....

以下展览控制器位:

def new
@museum = Museum.all
end

2 个答案:

答案 0 :(得分:1)

在这种情况下创建展示时,您不会使用嵌套表单。只需为每个博物馆提供一个选择标签选项。

controller:

def new
    @exibition = Exibition.new
end


view:
<%= form_for(@exibition) do |f| %>
    ...
    <%= f.collection_select(:museum_id, Museum.all, :id, :name) %>

答案 1 :(得分:0)

对于采用路径exhibitions#new的{​​{1}}(作为示例),然后:

/museums/1/exhibitions/new

由于def new puts params[:museum_id] # => 1 @museum = Museum.find(params[:museum_id]) @exhibition = Exhibition.new end 现在是一个记录对象,因此您可以在@museum

中使用以下内容
exhibitions/new.html.erb

请注意<%= form_for(@exhibition, url: museum_exhibitions_path(@museum)) do |f| %> 转换为路径museum_exhibitions_path(@museum),其中......

  1. 如果是GET请求,那么它将由控制器方法/museums/1/exhibitions处理

  2. 如果是POST请求,那么它将由控制器方法exhibitions#index处理

  3. 现在,因为exhibitions#create默认情况下自动使用POST请求,然后form_for将被委托给此路由,这就是我们想要的。

    或者只是使用

    exhibitions#create