我一直在疯狂地尝试解决这个问题 permit 使用其他一些 StackOverflow 帖子时出错,但似乎无法克服它。我有一个项目模型和控制器以及一个版本模型和控制器。 Projects/##/versions/new 是创建新版本项目id##的表单页面。但是当我单击提交按钮创建版本时...它会在 VersionsController:

undefined method `permit' for "Submit Now! ":String

Extracted source (around line #36):
34
35
36
37
38


    def version_params
      params.require(:version).permit(:title)
    end
end

任何和所有的帮助将不胜感激......我已经尝试解决这个问题太久了。我的代码如下:

路线.RB

resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :projects, only: [:create, :new, :show, :edit, :update, :destroy]

  resources :projects do
    resources :versions
  end

  # get "static_pages/home"
  # get "static_pages/help"
  # get "static_pages/about"
  #The original routes above map to...
  root  'static_pages#home'
  match '/signup',  to: 'users#new',            via: 'get'
  match '/signin',  to: 'sessions#new',         via: 'get'
  match '/signout', to: 'sessions#destroy',     via: 'delete'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'

项目模型:

class Project < ActiveRecord::Base
  has_many :users
  has_many :versions, dependent: :destroy
  validates :title, presence: true, length: { maximum: 100 }
  validates :background, presence: true
  validates :user_id, presence: true

  default_scope -> { order('created_at DESC') }
end

版本型号:

class Version < ActiveRecord::Base
  belongs_to :project
  validates :title, presence: true, length: { maximum: 140 }

  default_scope -> { order('created_at DESC') }
end

版本控制器:

class VersionsController < ApplicationController
  def new
    @version = Version.new
  end

  def show
    @project = Project.find(params[:project_id])
    @version = Version.find(params[:id])
  end

  def index
    @versions = Version.paginate(page: params[:page])
  end

  def create
    @project = Project.find(params[:project_id])
    @version = @project.versions.create(version_params)
    if @version.save
      flash[:success] = "You've successfully added a version to this branch..."
      redirect_to project_path(@project)
    else
      render 'new'
    end
  end

  def edit

  end

  def update

  end

  def destroy

  end

  private

    def version_params
      params.require(:version).permit(:title)
    end
end

NEW.HTML.ERB(新版本表格):

<% provide(:title, 'New Version') %>
<h1>Add a version to this project</h1>

<div class="row-fluid">
  <div class="col-md-5 no-pad offset3">
    <%= bootstrap_form_for @version, :url => project_versions_path do |f| %>

      <%= render 'shared/error_messages', object: f.object %>

      <%= f.text_field :title %>

      <br clear="all">

      <%= f.submit "Submit Now! ", class: "btn btn-lg btn-primary" %>
    <% end %>
  </div>
</div>

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "submit"=>"Submit Now! ",
 "project_id"=>"51"}

Processing by VersionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"################=", "version"=>"Submit Now! ", "project_id"=>"51"}
  Project Load (0.3ms)  SELECT "projects".* FROM "projects" WHERE "projects"."id" = ? ORDER BY created_at DESC LIMIT 1  [["id", "51"]]
Completed 500 Internal Server Error in 3ms

NoMethodError (undefined method `permit' for "Submit Now! ":String):
  app/controllers/versions_controller.rb:41:in `version_params'
  app/controllers/versions_controller.rb:17:in `create'
有帮助吗?

解决方案

我可以识别参数中的问题。你有这个:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "submit"=>"Submit Now! ",
 "project_id"=>"51"}

你应该有这个:

{"utf8"=>"✓",
 "authenticity_token"=>"######AAAA",
 "project_id"=>"51",
 "version"=>{"title"=>"Foo Bar"},
"button"=>""}

这是一个问题的原因是因为您没有在参数中传递版本标题,并且您正在尝试使用参数创建新版本。相反,它会寻找最接近的东西,在本例中恰好是字符串“立即提交!”,但由于不允许“提交”,因此强参数会将其丢弃。

看起来您正在正确创建表单,这可能是 bootstrap_form_for 的问题。你能在你的表单上发布标题的输入输出在 html 中的样子吗?

同时,我有两个建议,第一件事可以解决问题,就是更改 f.提交f.按钮。f.button 仍然会创建一个提交按钮,但它允许您按照您想要的方式命名。

同样在控制器中,调用create后不需要保存。create 实际上会将其存储在数据库中,因此您将保存它两次。您应该调用 new 而不是 create

@version = @project.versions.new(version_params)
if @version.save

检查是否有新记录

@version = @project.versions.create(version_params)
unless @version.new_record?
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top