在外部模型的show动作中构建表单

时间:2013-12-22 04:44:24

标签: ruby-on-rails ruby-on-rails-4 simple-form nested-forms

我正在尝试在控制器的show动作中构建一个表单。这是我的设置。

类别模型

class Category < ActiveRecord::Base

   # Associations 
   has_many :feeds
   has_many :subscriptions

  # Nested attributes
  accepts_nested_attributes_for :subscriptions

end

订阅模式

class Subscription < ActiveRecord::Base

    # Associations
    belongs_to :profile
    belongs_to :category
    belongs_to :feed

end

使用订阅命名空间:

  # Subscriptions
  namespace :subscriptions do
    resources :categories
  end

在类别(http://URL.com/subscriptions/categories/1)的show动作中,我想构建订阅模型表单并列出该类别的可用订阅源。我希望表单将已签出的订阅源提交到订阅模型。

CategoriesController

  def show
    @feeds = Feed.where("category_id = ?", @category)
  end

尝试在“类别”视图的“显示”操作中构建表单:

<%= simple_form_for [:subscriptions, @category] do |f| %>
    <%= f.association :feeds, collection: @feeds, value_method: :id, as: :check_boxes %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

现在它正在呈现适当的信息,但它呈现为编辑表单,而不是创建表单。我该如何解决这个问题?

我还需要添加哪些路由/控制器来实际获取要保存到订阅模型的信息?

感谢。

1 个答案:

答案 0 :(得分:0)

首先我不确定在show action和视图中初始化@category对象的位置。如果你想渲染一个新的页面,它应该映射到控制器的新动作,你的路径将是

http://URL.com/subscriptions/categories/new

您正在使用的路径

http://URL.com/subscriptions/categories/1 

将始终根据rails约定映射到show动作,尽管您可以相应地覆盖它,但这不是一个好习惯。也可以在新操作中按

初始化实例
@category = Category.new

现在提交它将自动转到创建操作。如果你的@category已经存在于数据库中,例如

 @category = Category.find(1)

现在,如果此对象转到simple_form_for,它将发送数据以进行更新操作。