正确处理Rails中的Category模型

时间:2016-10-08 14:20:40

标签: ruby-on-rails ruby

我的应用程序有我要关联的类别和应用程序模型

类别=> has_many:apps, App => belongs_to:category

我在创建和更新应用模型时能够选择类别的用户是成功完成的tutorial i use

问题是当用户创建应用模型忘记传递应用程序崩溃的任何类别时(我不知道如何处理这个)

应用程序崩溃,错误为

同样,当用户创建传递类别的应用模型时,则决定稍后进行编辑。 。类别字段不会指向最后选择的类别(显示提示"选择类别"),当用户选择不更新类别字段时会发生同样的错误!

我的表格部分

<%= simple_form_for @app do |f| %>
  <%= select_tag(:category_id, options_for_select(@categories), {:prompt => "--select category--"}) %>
  <%= f.input :title, label: "Application title" %>
  <%= f.input :creator %>
  <%= f.input :description %>
  <%= f.button :submit %>
<% end %>

我的apps_controller

def new
    @app = current_user.apps.build
    @categories = Category.all.map { |c| [c.name, c.id]  }
end

def create
    @app = current_user.apps.build(app_params)
    @app.category_id = params[:category_id]

    if @app.save
        redirect_to root_path
    else
        render :new
    end
end

def edit
    @categories = Category.all.map { |c| [c.name, c.id]  }

end

def update
    @app.category_id = params[:category_id]
    if @app.update(app_params)
        redirect_to @app
    else
        render :edit
    end
end

我做错了什么?我怎样才能准确处理这种情况?

2 个答案:

答案 0 :(得分:1)

如果创建和更新失败,请务必初始化@categories。

在创建

if @app.save
   redirect_to root_path 
else
   #initialise @categories
   @categories = Category.all.map { |c| [c.name, c.id] }
   render :new
 end

在更新中

if @app.update(app_params)
  redirect_to @app
else
  @categories = Category.all.map { |c| [c.name, c.id] }
  render :edit 
end

答案 1 :(得分:1)

  1. 使用collection_select
  2. 您使用的select_tag超出了表单对象的范围
  3. 修正:

    <%= simple_form_for @app do |f| %>
      <%= f.collection_select :category_id, @categories, :id, :name %>
      <%= f.input :title, label: "Application title" %>
      <%= f.input :creator %>
      <%= f.input :description %>
      <%= f.button :submit %>
    <% end %>
    

    您需要删除控制器中的map

    #app/controllers/apps_controller.rb
    class AppsController < ApplicationController
      def new
        @app = current_user.apps.new
        @categories = Category.all
      end
    end
    

    这假设您的category_id

    中有apps