[英]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個默認字段id
, created_at
和updated_at
。 因此,在執行update
操作時,您需要執行以下操作:
if @project.update(project_params)
要么
if @project.update_attributes(params[:project])
由於update
和update_attributes
需要將Hash
作為參數,並且params[:project]
為nil,因此會出現錯誤。 查看服務器日志中的params
哈希
{"utf8"=>"√", "authenticity_token"=>"gST6BUQNwOZQDYVj60DXLuFANv1JsM02YAIM+xYwt/M=", "commit"=>"Update project", "id"=>"1"}
它沒有關鍵project
。
無需添加新字段
如果您不打算在projects
表中添加任何新字段,那么進行update
操作就沒有意義,因為您將在哪個字段上進行更新?
隨着添加新字段
您可以根據需要將新字段添加到projects
表中,例如name
, duration
等(通過創建遷移以添加新字段)。
之后,您只需要更新project_params
方法,如下所示:
def project_params
params.require(:project).permit(:name, :duration)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.