Ruby on Rails: данные не сохраняют ActiveRecord

Я новичок в Ruby on Rails и пытаюсь создать простой блог. Однако, когда я пытаюсь сохранить новое сообщение, страница перезагружается, и данные не сохраняются. Однако данные присутствуют в URI.

Вот мой контроллер:

class PostsController < ApplicationController
 before_action :set_post, only: [:show, :edit, :update, :destroy]

# GET /posts
# GET /posts.json
 def index
  @posts = Post.all
 end

# GET /posts/1
# GET /posts/1.json
def show
end

# GET /posts/new
def new
 @post = Post.new
end

# GET /posts/1/edit
def edit
end

# POST /posts
# POST /posts.json
def create
 @post = Post.new(post_params)

 respond_to do |format|
   if @post.save
     format.html { redirect_to @post, notice: 'Post was successfully created.' }
     format.json { render :show, status: :created, location: @post }
   else
     format.html { render :new }
     format.json { render json: @post.errors, status: :unprocessable_entity }
   end
 end
end

# PATCH/PUT /posts/1
# PATCH/PUT /posts/1.json
def update
  respond_to do |format|
    if @post.update(post_params)
      format.html { redirect_to @post, notice: 'Post was successfully updated.' }
      format.json { render :show, status: :ok, location: @post }
    else
     format.html { render :edit }
     format.json { render json: @post.errors, status: :unprocessable_entity }
   end
 end
end

# DELETE /posts/1
# DELETE /posts/1.json
def destroy
  @post.destroy
  respond_to do |format|
    format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' }
    format.json { head :no_content }
  end
end

private
  # Use callbacks to share common setup or constraints between actions.
  def set_post
    @post = Post.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def post_params
    params.require(:post).permit(:title, :category, :body)
  end
end

Я изменил форму, полученную с помощью строительных лесов:

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

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

  <div class="form-group">
   <%= f.label :title %><br>
   <%= f.text_field :title, class: "form-control" %>
  </div>
  <div class="form-group">
   <%= f.label :category %><br>
   <%= f.select(:category, options_for_select(["Programming", "Commentary", "Book Reviews"]), {}, { class: "form-control" })%>
  </div>
  <div class="form-group">
    <%= f.label :body %><br>
    <%= f.text_area :body, class: "form-control", rows: "50" %>
  </div>
  <div class="actions">
    <%= f.submit(class: "btn btn-primary") %>
  </div>
 <% end %>
</form>

Вот моя модель:

class Post < ActiveRecord::Base
    validates :title, presence: true
end

Вот логи с сервера:

Started GET "/posts/new?  utf8=%E2%9C%93&authenticity_token=QfJgH82nuYVTEa1vovO4VlIjZmMeJvBLj6bkNKDrz08%3D&post%5Btitle% 5D=Hello&post%5Bcategory%5D=Programming&post%5Bbody%5D=Hello&commit=Create+Post" for 127.0.0.1   at 2014-08-11 11:38:46 -0400
Processing by PostsController#new as HTML
Parameters: {"utf8"=>"✓",   "authenticity_token"=>"QfJgH82nuYVTEa1vovO4VlIjZmMeJvBLj6bkNKDrz08=", "post"=>   {"title"=>"Hello", "category"=>"Programming", "body"=>"Hello"}, "commit"=>"Create Post"}
Rendered posts/_form.html.erb (2.3ms)
Rendered posts/new.html.erb within layouts/application (3.2ms)
Completed 200 OK in 21ms (Views: 19.1ms | ActiveRecord: 0.0ms)

person DaneEH    schedule 11.08.2014    source источник
comment
поэтому ошибка связана с вашей моделью (учитывая, что это происходит в консоли, которая не использует форму или контроллер). Можете ли вы добавить свою модель к вопросу?   -  person sevenseacat    schedule 11.08.2014
comment
вам нужно реализовать метод #post по мере того, как вы декалируете validates :post, presence: true. Но вы этого не сделали, поэтому и ошибка.   -  person Arup Rakshit    schedule 11.08.2014
comment
ваш объект Post проверяет наличие поля post? Это не имеет смысла.   -  person sevenseacat    schedule 11.08.2014
comment
Добавлен. Я почти не добавлял никаких изменений в модель. На самом деле ошибка произошла до того, как я разместил проверки. Я ввел проверки, чтобы увидеть, вызовет ли это какие-либо ошибки, но это не так.   -  person DaneEH    schedule 11.08.2014
comment
удалите проверку post и повторите попытку.   -  person sevenseacat    schedule 11.08.2014
comment
Я удалил проверку сообщения и сохранил ее в консоли, но моя страница все еще перезагружает новую страницу.   -  person DaneEH    schedule 11.08.2014
comment
Можете ли вы опубликовать журналы с вашего сервера, которые показывают отправленные параметры и что происходит после обработки?   -  person sevenseacat    schedule 11.08.2014


Ответы (1)


Ваша проблема связана с вашим неверным HTML-кодом - у вас есть внешний тег <form>, а затем внутренний тег <form> (сгенерированный Rails form_for). Ваш браузер следует директиве внешней формы, которая по умолчанию просто отправляет на ту же страницу через запрос GET.

Вы хотите, чтобы ваш браузер следовал внутреннему тегу формы, который говорит браузеру отправить запрос POST на URL-адрес создания. Поэтому удалите внешний тег form.

person sevenseacat    schedule 11.08.2014