在将其更改为嵌套资源后,表单已损坏

时间:2017-05-18 13:17:14

标签: ruby-on-rails

在这个Rails应用程序中,用户可以编写故事并将其添加到集合中。当他们编写故事时,用户可以将其添加到现有集合中,或者通过模态在stories / new.html.erb视图中创建新集合。

目前看起来像

的routes.rb

<%= form_for Collection.new do |f| %>

new.html.erb

class CollectionsController < ApplicationController

def new
  @user = current_user # or however
  @collection = Collection.new
end

  def show
    @collection = Collection.friendly.find(params[:id]) 
  end

  def create
    @collection = current_user.collections.build(collection_params)
    if @collection.save
      render json: @collection
    else
      render json: {errors: @collection.errors.full_messages}
    end
  end

  private

  def collection_params
    params.require(:collection).permit(:name, :description)
  end
end

集合控制器

class StoriesController < ApplicationController
  def new
    @story = Story.new
    authorize @story
  end
end

故事控制器

resources :users do
   resources :collections 

现在我想嵌套路由,使集合属于用户

 <%= form_for Collection.new do |f| %> 

但是,这会导致此行出错

# Outputs a copy of "common.js" file with new name, but does not uglify or mangle
$uglify $CK_OUTPUT_PATH \
         -o $CK_PROJECT_ROOT/js/common.min.js -c –m

# Same thing, outputs only a copy with new name
$CK_OUTPUT_PATH uglifyjs --compress --mangle --output $CK_PROJECT_ROOT/js/common.min.js

它不再有效。怎么解决这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

嵌套资源后,收集路由已更改

如果路线较早

/collections/24

现在变成了

/users/1/collections/24

所以你必须改变form_for方法。您需要添加嵌套的资源,在这种情况下应该是

<%= form_for [@user,@collection] do |f| %>
    #your code here
<% end %>

此外,您还必须为两个模型添加关联,即用户has_many :collections和收藏belongs_to :user

在您的控制器中,必须先实例化第一个用户,然后创建集合:

@user = current_user #The parameter can be named anything
@collection = Collection.new

答案 1 :(得分:0)

您需要告诉表单对象有关新路由架构的信息。

也不要将Model.new直接写入您的表单。

当嵌套这样的路线时,我们会对用户和集合做出假设,即用户已经存在。

您应该在new操作中实例化您的资源(现有用户和新收藏集)。

def new
  @user = User.find(params[:user_id]) # since nested
  @collection = Collection.new
end

<% form_for [@user, @collection] do |f| %>
<% end %>