【问题标题】:Rails - collection_select is converting output to a string instead of an integer (and not saving)Rails - collection_select 将输出转换为字符串而不是整数(而不是保存)
【发布时间】:2016-08-24 04:46:19
【问题描述】:

我在 rails 中的 collection_select 出现问题,我似乎找不到是什么原因造成的。我有 3 个模型、用户、项目和预算。

用户可以有多个项目,项目可以有一个预算。每个预算都有一个项目。

我创建了一个 collection_select 字段来显示可供用户选择的可能预算列表,它工作正常,除了出于某种原因,它在将预算“id”(一个整数)转换为字符串之前将其保存为我的“projects”表中的“budget_id”字段中的一个整数。我不明白它为什么这样做!任何帮助将不胜感激!

代码如下:

当我提交一个新的项目表单(显示正确)时从终端中提取。据我所见,它正确选择了所选预算项目的 id,但它以某种方式将其从整数转换为字符串,这就是为什么它不会保存?:

Started POST "/projects" for ::1 at 2016-08-23 22:24:10 +0200
Processing by ProjectsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"DCY3kFtDVDguJUqznBDuJcXEZBqbsxz3Q1bCxNngkPIaccAFpl43vKD9308cOLlZboVcjvDu2FTTmLwI+9ERdw==", "project"=>{"description"=>"this is a test"}, "Project"=>{"budget_id"=>"4"}, "commit"=>"Create Project"}
User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
(0.1ms)  BEGIN
SQL (0.5ms)  INSERT INTO "projects" ("description", "created_at", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id"  [["description", "this is a test"], ["created_at", 2016-08-23 20:24:10 UTC], ["updated_at", 2016-08-23 20:24:10 UTC], ["user_id", 1]]
(5.8ms)  COMMIT
Redirected to http://localhost:3000/projects/27
Completed 302 Found in 16ms (ActiveRecord: 6.8ms)

这是预算、用户和项目表的架构

create_table "budgets", force: :cascade do |t|
  t.string   "name"
  t.integer  "minimum"
  t.integer  "maximum"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "projects", force: :cascade do |t|
  t.string   "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
  t.integer  "user_id"
  t.integer  "budget_id"
  t.index ["user_id"], name: "index_projects_on_user_id", using: :btree
end

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "", null: false
  t.string   "encrypted_password",     default: "", null: false
  t.string   "reset_password_token"
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          default: 0,  null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.inet     "current_sign_in_ip"
  t.inet     "last_sign_in_ip"
  t.datetime "created_at",                          null: false
  t.datetime "updated_at",                          null: false
  t.string   "first_name"
  t.string   "last_name"
  t.string   "phone"
  t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
  t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
end

从项目控制器中提取

def new
  @project = current_user.projects.new
  @budgets = Budget.all
end

def create
  @project = current_user.projects.new(project_params)
    if @project.save!
      redirect_to @project, notice: 'Project was successfully created.'
    else
      render :new
    end
end

def project_params
  params.require(:project).permit(:user_id, :description, :budget_id)
end

从新项目的 _form 视图中提取

<div class="field">
  <%= f.label :budget %>
  <%= collection_select(:Project, :budget_id, @budgets, :id, :list_of_budgets) %>
  </div>

项目模型

class Project < ApplicationRecord
  belongs_to :user
  has_one :budget
end

预算模型

class Budget < ApplicationRecord
  belongs_to :project


 def list_of_budgets
    "#{name} (#{minimum} to #{maximum})"
  end 


end

我不知所措!感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails collection-select


    【解决方案1】:

    表单参数总是作为字符串提交 - rails 会处理。

    您的问题是您使用了:Project 而不是:project,因此该值最终为params[:Project][:budget_id] 而不是params[:project][:budget_id]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2018-03-30
      • 2021-03-20
      • 2020-01-25
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多