Rails 脚手架表单未更新数据库

Rails scaffold form not updating database

我在 rails 中使用脚手架来创建一个应用程序,用户可以在其中提交想法,然后所有想法都将列在主页上。我目前只是想获取提交和列表功能,但是在 _form.html.erb 文件中生成的脚手架表单似乎并没有实际提交任何内容或更新数据库。也就是说,我既没有收到消息 "Idea submitted successfully",也没有收到消息 "Error submitting idea"。它只是刷新表单页面。

我想知道这是否是我的 routes.rb 文件的问题或其他问题,因为在互联网上花了很多时间后我觉得我的大部分代码应该可以工作。

idea.rb

class Idea < ApplicationRecord    
  belongs_to :user
  belongs_to :category

  has_many :comments

  validates :title, :user, :anonymous, :contents, presence: true
  validates :deleted, inclusion: { in: [true, false]}

  scope :alive, -> { where deleted: false } 

  def children
    Comment.where(idea_id: id, deleted: false)
  end    
end

ideas_controller.rb

class IdeasController < ApplicationController

  def index
    @ideas = Idea.alive.paginate(page: params[:page], per_page: 20)
  end

  def show
    @idea = Idea.find(params[:id])
    @comments = @idea.children
    @reply = Comment.new
  end

  def new
    @idea = Idea.new
    @categories = Category.all.map{|c| [ c.name, c.id ] }
  end

  def new_comment
    @idea = Idea.find(params[:id])
    @comment = Comment.new
  end

  def create
    @idea = Idea.new(idea_params)
    if @idea.save
      redirect_to @idea, alert: "Idea submitted successfully."
    else
      redirect_to new_idea_path, alert: "Error submitting idea."
    end
  end

  def idea_params
    params.require(:idea).permit(:title, :contents, :anonymous, :category)
  end   
end

_form.html.erb:

<%= form_for @idea do |f| %>
  <% if idea.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(idea.errors.count, "error") %> prohibited this idea from being saved:</h2>

      <ul>
      <% idea.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
</div>
<div class="field">
    <%= f.check_box(:anonymous) %>
    <%= f.label(:anonymous, "Hide my name") %>
</div>
<div class="field">
    <%= f.label :contents %><br />
    <%= f.text_area :contents %>
</div>
      <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

create_ideas.rb:

class CreateIdeas < ActiveRecord::Migration[5.0]
  def change
    create_table :ideas do |t|

    t.string :title
    t.text :contents
    t.boolean "anonymous", limit: 1, default: false
    t.boolean "deleted", limit: 1, default: false

    t.timestamps
    end
  end
end

routes.rb:

Rails.application.routes.draw do
  resources :ideas
end

编辑:本身没有错误跟踪,因为我没有看到任何东西——表单页面只是重新加载。但是,这是服务器日志的输出:

Started POST "/ideas" for ::1 at 2017-01-28 20:40:07 -0500
Processing by IdeasController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5ooCTQZKBv1f1+SlZyl/7tkJzLx95EpckoPBpB710JrikRJqt8wOdE0GT3bjBl1m6wIxKQhzfXmKRrvkV+RHeA==", "idea"=>{"title"=>"sadfsd", "anonymous"=>"1", "contents"=>"sdafasdf"}, "commit"=>"Create Idea"}
   (0.3ms)  begin transaction
   (0.1ms)  rollback transaction
Redirected to http://localhost:3000/ideas/new
Completed 302 Found in 26ms (ActiveRecord: 0.4ms)

您已通过验证,但您违反了 :user 存在。

您的 ideas table 没有 user_id 列,这使得 belongs_to :user 关系无效。

您需要更改迁移

class CreateIdeas < ActiveRecord::Migration[5.0]
  def change
    create_table :ideas do |t|

      t.string :title
      t.text :contents
      t.boolean "anonymous", limit: 1, default: false
      t.boolean "deleted", limit: 1, default: false
      t.integer :user_id, index: true

      t.timestamps
    end
  end
end

并且运行您再次迁移,rake db:reset

或者,您可以创建另一个迁移以添加 user_id 列。

在您的控制器 create 中,确保您有 current_user,或以任何方式获取正在创建 idea 的用户,然后更改为

@idea = current_user.ideas.new(idea_params)