Форма лесов Rails не обновляет базу данных
Я использую эшафот в рельсах для создания приложения, в которое пользователи могут отправлять идеи, и тогда все идеи будут перечислены на главной странице. В настоящее время я просто пытаюсь получить функциональность отправки и перечисления, однако форма, созданная скаффолдом в файле _form.html.erb, похоже, на самом деле ничего не передает и не обновляет базу данных. Т.е. я не получаю ни сообщения "Идея отправлена успешно", ни сообщения "Ошибка при отправке идеи". Это просто обновляет страницу формы.
Мне интересно, является ли это проблемой с моим файлом rout.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)
1 ответ
У вас есть проверка и вы нарушаете :user
присутствие.
Ваш ideas
стол не имеет 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)