簡體   English   中英

Windows上的rails生成scaffold命令導致ArgumentError

[英]rails generate scaffold command on Windows causes ArgumentError

我使用“ rails generate scaffold project”創建了一個新的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>

在運行scaffold命令之后,我運行了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)

這是我的“更新”方法(由scaffold命令自動創建)

# 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

但這沒有任何區別。

我也嘗試過(我是通過瀏覽找到的)

# 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

您剛剛創建了一個沒有任何其他字段的支架。 因此,您的projects表僅具有3個默認字段idcreated_atupdated_at 因此,在執行update操作時,您需要執行以下操作:

if @project.update(project_params)

要么

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

由於updateupdate_attributes需要將Hash作為參數,並且params[:project]為nil,因此會出現錯誤。 查看服務器日志中的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM