Приложение откатывает транзакции, и я не знаю почему - PullRequest
0 голосов
/ 05 января 2019

Мне любопытно, почему мое Rails-приложение откатывает транзакции в БД без их запроса.

Журнал Puma:

Started POST "/posts" for 127.0.0.1 at 2019-01-05 00:32:32 -0500
Processing by PostsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"1AlwhyE0VY87oSyCyjmrzgxinJ7+t1TfoYYEDXvfl0pGd4DKE842KXHroFWgtXeusOgt+ZApHmB+e40qliTPjQ==", "post"=>{"title"=>"test", "category_id"=>"4", "body"=>"test"}, "commit"=>"Create Post"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 12], ["LIMIT", 1]]
↳ app/controllers/application_controller.rb:7
(0.2ms) begin transaction
↳ app/controllers/posts_controller.rb:14
Category Load (0.2ms) SELECT "categories".* FROM "categories" WHERE "categories"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]]
↳ app/controllers/posts_controller.rb:14
(0.1ms) rollback transaction
↳ app/controllers/posts_controller.rb:14
Redirected to http://localhost:3000/posts
Completed 302 Found in 18ms (ActiveRecord: 0.8ms)

Почтовый контроллер:

class PostsController < ApplicationController
  before_action :require_user

  def index
    @posts = Post.all
  end

  def new
    @post = Post.new
    @categories = Category.all
  end

  def create
    @post = Post.new(post_params)
    if @post.save(post_params)
      @post.author = current_user.username
      flash[:success] = "Post created."
      redirect_to post_path(@post.id)
    else
      flash[:danger] = "Post not created. Redirecting to main page....."
    redirect_to posts_path
  end
end

Вид:

<%= form_for @post do |f| %>
<%= f.label :title, "Title of Post" %>
<%= f.text_field :title, class: "form-control" %>
<%= f.label :body, "Post Text" %>
<%= f.text_area :body, class: "form-control" %>
<%= f.submit "Create Post", class: "btn btn-info"%>
<% end %>

Ответы [ 2 ]

0 голосов
/ 06 января 2019

В зависимости от версии Rails, которую вы используете, и если вы используете Strong Parameters , вы должны внести свои параметры в белый список в контроллере.

Пример из документации:

private
  # Using a private method to encapsulate the permissible parameters
  # is just a good pattern since you'll be able to reuse the same
  # permit list between create and update. Also, you can specialize
  # this method with per-user checking of permissible attributes.
  def person_params
    params.require(:person).permit(:name, :age)
  end
0 голосов
/ 05 января 2019

Возможно, у вас есть проверка наличия поля author. Так как он установлен неправильно в методе create, транзакция откатывается:

class PostsController < ApplicationController

  ...

  def create
    @post = Post.new(post_params)
    if @post.save(post_params)
      @post.author = current_user.username
      flash[:success] = "Post created."
      redirect_to post_path(@post.id)

  ...
end

Для того, чтобы author был назначен и сохранен в БД, вам необходимо присвоить author до сохранения:

class PostsController < ApplicationController

  ...

  def create
    @post = Post.new(post_params)
    @post.author = current_user.username

    if @post.save(post_params)
      flash[:success] = "Post created."
      redirect_to post_path(@post.id)

  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...