首页 > 解决方案 > rails没有提交表单值?

问题描述

我有一个表格text_area。我的问题是,当我单击提交时,它没有提交 text_area 值并将其保留为空。我不知道为什么。希望有人帮忙。

服务器日志

Started POST "/user/2/posts/2/recommendations" for 127.0.0.1 at 2018-08-03 09:14:46 +0200
Processing by RecommendationsController#create as JS
  Parameters: {"utf8"=>"✓", "recommendation"=>{"text"=>"hello_world"}, "commit"=>"submit", "user_id"=>"2", "post_id"=>"2"}
  User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/recommendations_controller.rb:6
  Post Load (0.0ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/recommendations_controller.rb:7
   (0.0ms)  begin transaction
  ↳ app/controllers/recommendations_controller.rb:17
  Post Load (0.0ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/recommendations_controller.rb:17
  recommendation Create (46.9ms)  INSERT INTO "recommendations" ("created_at", "updated_at", "user_id", "post_id") VALUES (?, ?, ?, ?)  [["created_at", "2018-08-03 07:14:47.832846"], ["updated_at", "2018-08-03 07:14:47.832846"], ["user_id", 2], ["post_id", 2]]
  ↳ app/controllers/recommendations_controller.rb:17
   (0.0ms)  rollback transaction
  ↳ app/controllers/recommendations_controller.rb:17
Completed 500 Internal Server Error in 141ms (ActiveRecord: 46.9ms)

ActiveRecord::NotNullViolation (SQLite3::ConstraintException: NOT NULL constraint failed: recommendations.text: INSERT INTO "recommendations" ("created_at", "updated_at", "user_id", "post_id") VALUES (?, ?, ?, ?)):

app/controllers/recommendations_controller.rb:17:in `create'

帖子\show.html.erb

<%= @post.user.username %>
<%= @post.content %>
    <%= form_for [@user, @post, @recommendation], method: :post, remote: true do |f| %>
      <%= f.text_area :text %>
      <%= f.submit "submit" %>
    <% end %>

推荐控制器.rb

class RecommendationsController < ApplicationController
  def new
    @recommendation = recommendation.new
  end

  def create
    @user = current_user
    @post = Post.find(params[:post_id])
    @recommendation = current_user.recommendations.new(permit)
    @recommendation.user_id = @user.id
    @recommendation.post_id = @post.id

    if @recommendation.save
      respond_to do |format|
        format.html { redirect_back(fallback_location: 'back') }
        format.js
      end
    else
      redirect_to 'layouts/404'
    end
  end

  private

  def permit
    params.permit(:text)
  end
end

模型/用户.rb

has_many :recommendations

模型/post.rb

has_many :recommendations

模型/recommendation.rb

belongs_to :user
belongs_to :post

图式

create_table "recommendations", force: :cascade do |t|
  t.text "text", null: false
  t.integer "user_id"
  t.integer "post_id"
end

标签: ruby-on-rails

解决方案


我相信您错误地允许了参数。您可以这样做params.permit(:text),但表单中的推荐属性必须嵌套在 key :recommendationin 中params

尝试将permit(无论如何,这不是该方法的最佳名称)更改为:

def permit
  params.require(:recommendation).permit(:text)
end

推荐阅读