【问题标题】:rails generate scaffold command on Windows causes ArgumentErrorrails 在 Windows 上生成脚手架命令导致 ArgumentError
【发布时间】:2014-04-29 18:39:30
【问题描述】:

我使用“rails 生成脚手架项目”来创建一个新的 Web 应用程序。过去我已经在运行其他版本的 rails 和 ruby​​ 的 Linux 和 Mac OSX 上执行此操作,并且一切正常,但这次我在 Windows 7 上工作。这是我的环境

C:\Users\user1\Company>ruby -v
ruby 2.0.0p451 (2014-02-24) [x64-mingw32]

C:\Users\user1\Company>rails -v
DL is deprecated, please use Fiddle
Rails 4.1.0

C:\Users\user1\Company>

在我运行了脚手架命令之后,我运行了 rake db:migrate 并且我能够成功地创建我的第一个项目。然后我可以编辑项目,但是当我点击更新时,我收到以下错误消息

ArgumentError (When assigning attributes, you must pass a hash as an argument.):

完整的服务器日志消息

Started PATCH "/projects/1" for 127.0.0.1 at 2014-04-29 05:16:33 -0700
Processing by projectsController#update as HTML
  Parameters: {"utf8"=>"√", "authenticity_token"=>"gST6BUQNwOZQDYVj60DXLuFANv1JsM02YAIM+xYwt/M=", "commit"=>"Update project", "id"=>"1"}
  project Load (0.0ms)  SELECT  "projects".* FROM "projects"  WHERE "projects"."id"= ? LIMIT 1  [["id", 1]]
   (1.0ms)  begin transaction
   (0.0ms)  rollback transaction
Completed 500 Internal Server Error in 10ms

ArgumentError (When assigning attributes, you must pass a hash as an argument.):

  app/controllers/projects_controller.rb:44:in `block in update'
  app/controllers/projects_controller.rb:43:in `update'

  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (2.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (2.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (104.0ms)

这是我的“更新”方法(由脚手架命令自动创建)

# PATCH/PUT /projects/1
# PATCH/PUT /projects/1.json
def update
  respond_to do |format|
    if @project.update(project_params)
      format.html { redirect_to @project, notice: 'Update Successful!' }
      format.json { render :show, status: :ok, location: @project }
    else
      format.html { render :edit }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

我尝试删除“PATCH/”关键字,但没有成功。我用以下方法替换了整个方法(这适用于我的其他应用程序,但这次不适用于 Windows)

# PATCH/PUT /projects/1
# PATCH/PUT /projects/1.json
def update
  @project = Project.find(params[:id])

  if @project.update_attributes(params[:project])
    flash[:notice] = "Update Successful!"
  end
  respond_with(@project)
end

但这并没有什么不同。

我也试过(我通过浏览 SO 找到了这个)

# PUT /projects/1
# PUT /projects/1.json
def update
  @project = Project.find(params[:id])

  respond_to do |format|
    if @project.update_attributes(params[:project])
      format.html { redirect_to @project, notice: 'Update Successful!' }
      format.json { head :ok }
    else
      format.html { render action: "edit" }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end

但也没有成功

这里是其他的工作方法(都是由“rails generate scaffold”命令自动生成的,它们都工作正常)

# GET /projects
# GET /projects.json
def index
  @projects = project.all
end

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

# GET /projects/new
def new
  @project = project.new
end

# GET /projects/1/edit
def edit
end

# POST /projects
# POST /projects.json
def create
  @project = project.new(project_params)

  respond_to do |format|
    if @project.save
      format.html { redirect_to @project, notice: 'Creation Successful!' }
      format.json { render :show, status: :created, location: @project }
    else
      format.html { render :new }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

为什么“rails generate scaffold”命令不能在 Windows 上运行而在 Linux 和 Mac OSX 上运行良好?

更新 1

以下是“rails generate scaffold”命令自动创建的其他方法

class ProjectsController < ApplicationController
  before_action :set_project, only: [:show, :edit, :update, :destroy]

  <other methods listed above : index, show, new, edit, create, update, and destroy>

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def project_params
      params[:project]
    end
end

进行 Kirti Thorat 建议的更改后的工作代码

这对我有用

# PATCH/PUT /projects/1
# PATCH/PUT /projects/1.json
def update

@project = Project.find(params[:id])

  respond_to do |format|
    if @project.update(project_params)
      format.html { redirect_to @project, notice: 'Project was successfully updated.' }
      format.json { render :show, status: :ok, location: @project }
    else
      format.html { render :edit }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

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

  # Never trust parameters from the scary internet, only allow the white list through.
  def project_params
    params.require(:project).permit(:UnitMgtAddress)
  end

【问题讨论】:

  • 发布您的project_params 方法
  • @Pavan :感谢您的及时回复。我按“更新 1”下的问题按原样更新,我这边没有任何更改。
  • 目前Project拥有哪些属性?

标签: ruby-on-rails scaffolding


【解决方案1】:

您刚刚创建了一个没有任何其他字段的脚手架。所以你的projects 表只有三个默认字段idcreated_atupdated_at。因为在您的update 操作中您这样做:

if @project.update(project_params)

或者

if @project.update_attributes(params[:project])

您会收到错误,因为 updateupdate_attributes 需要 Hash 作为参数,而 params[:project] 为零。从服务器日志中查看您的 params 哈希

{"utf8"=>"√", "authenticity_token"=>"gST6BUQNwOZQDYVj60DXLuFANv1JsM02YAIM+xYwt/M=", "commit"=>"Update project", "id"=>"1"}

它没有密钥project

可能的解决方案

不添加新字段

如果您不打算在 projects 表中添加任何新字段,那么将 update 操作作为您要更新的字段是没有意义的?

添加新字段

您可以根据您的要求向projects 表中添加新字段,例如nameduration 等(通过创建迁移来添加新字段)。

在此之后,您只需要更新project_params 方法,如下所示:

def project_params
  params.require(:project).permit(:name, :duration)
end

【讨论】:

  • 只是好奇。如果project_params 中的params[:project] 更改为params.permit(id: []),它可以工作吗?
  • 不。它行不通。因为首先id 没有作为array 传递,其次当OP 实际上在projects 表中添加一些字段时,这会产生问题。
  • 感谢您的简短解释。我只是习惯了强参数。
  • 我仍然想知道如何解决这类特殊问题。
  • 不管怎样,在印度这里是凌晨 1:00。早上好。我现在最好睡觉了。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2018-12-15
  • 1970-01-01
相关资源
最近更新 更多