Ruby on rails 缺少Param或值为空-更新方法ruby on rails
我正在为rockhounds开发一个应用程序,它可以让他们追踪找到的岩石。我正在尝试完成一个允许用户更新rocks的方法。如果您进入“/edit”页面输入url,则该方法本身有效,但当尝试通过岩石显示页面的链接访问该页面时,我收到一个错误: 参数丢失或值为空:rock 它来自我的rocks控制器中的第43行,在方法rock_参数中。此请求的参数为:Ruby on rails 缺少Param或值为空-更新方法ruby on rails,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,我正在为rockhounds开发一个应用程序,它可以让他们追踪找到的岩石。我正在尝试完成一个允许用户更新rocks的方法。如果您进入“/edit”页面输入url,则该方法本身有效,但当尝试通过岩石显示页面的链接访问该页面时,我收到一个错误: 参数丢失或值为空:rock 它来自我的rocks控制器中的第43行,在方法rock_参数中。此请求的参数为: {“\u方法”=>“补丁”、“真实性令牌”=>“TIQJQCMI6LBDPOxQ2X7FNTAMWEZ3EAandGQ1TV4NJKXIevunwK
{“\u方法”=>“补丁”、“真实性令牌”=>“TIQJQCMI6LBDPOxQ2X7FNTAMWEZ3EAandGQ1TV4NJKXIevunwKH3EFD9F2LIRZWBYEC5M3RUER0/FHQnww=”,“id”=>“6”}
这是我的控制器代码
before_action :find_rock, only: [:show, :edit, :update, :destroy]
def index
@rocks = Rock.all
end
def show
@rock = Rock.find_by(id: params[:id])
end
def new
@rock = Rock.new
end
def create
@rock = Rock.new(rock_params)
if @rock.save
redirect_to @rock
else
render :new
end
end
def update
if @rock.update(rock_params)
redirect_to @rock
else
render :edit
end
end
def destroy
@rock = Rock.find(params[:id])
@rock.destroy
redirect_to rocks_path
end
private
def rock_params
params.require(:rock).permit(:id, :nick_name, :category, :minerals, :outcrop)
end
def find_rock
@rock = Rock.find(params[:id])
end
end ```
Here is the view code for the show page:
`<h1> Rock: </h1>
<h2> Rock Name: <%= @rock.nick_name %></h2>
<h2> Rock Type: <%= @rock.category %></h2>
<h2> Major Minerals: <%= @rock.minerals %></h2>
<h2> Outcrop? : <%= @rock.outcrop %></h2>
<%= link_to "Edit this rock", edit_rock_path(@rock), method: :patch %>
<%= link_to "Delete this rock", rock_path(@rock), method: :delete %> `
and the edit page:
```<%= form_for :rock do |f| %>
Name: <%= f.text_field :nick_name %><br>
Category: <%= f.select :category, ['Igneous', 'Sedimentary', 'Metamorphic'] %><br>
Major Minerals <%= f.text_area :minerals %><br>
Outcrop or Boulder? <%= f.select :outcrop, ['Outcrop', 'Boulder'] %><br>
<%= f.submit %>
<% end %> ```
and here are my routes:
```resources :rocks
resources :users
resources :locations
post '/users/new', to:"users#create"
get '/signup', to:"users#new", as: "signup"
post '/rocks/new', to:"rocks#create"
get '/rocks/:id/edit', to:"rocks#edit"
patch '/rocks/:id/edit', to:"rocks#update"
post '/rocks/:id/destroy', to:"rocks#destroy"
root to: "rocks#index"
get '/login', to: "auth#login", as: "login"
post '/login', to: "auth#authenticate"
get '/logout', to: "auth#logout"```
So the question is **How do I fix the empty param error that occurs when clicking the link to edit a rock from the show page for that rock?**
在操作之前:查找岩石,仅:[:显示,:编辑,:更新,:销毁]
def索引
@岩石=岩石
结束
def秀
@rock=rock.find_by(id:params[:id])
结束
def新
@摇滚乐
结束
def创建
@岩石=岩石。新(岩石参数)
如果@rock.save
将_重定向到@rock
其他的
渲染:新
结束
结束
def更新
如果@rock.update(岩石参数)
将_重定向到@rock
其他的
渲染:编辑
结束
结束
def销毁
@rock=rock.find(参数[:id])
@摧毁
将_重定向到rocks_路径
结束
私有的
def rock_params
参数要求(:岩石)。许可证(:id,:nick_姓名,:类别,:矿物,:露头)
结束
def发现_岩
@rock=rock.find(参数[:id])
结束
结束```
以下是显示页面的查看代码:
`摇滚乐:
岩石名称:
岩石类型:
主要矿物:
露头?:
`
和编辑页面:
```
名称:
类别:
主要矿物
露头还是巨石
```
以下是我的路线:
```资源:岩石
资源:用户
资源:地点
将“/users/new”张贴到:“users#create”
将“/signup”改为“users#new”,改为“signup”
将“/rocks/new”张贴到:“rocks#create”
获取“/rocks/:id/edit”至:“rocks#edit”
补丁“/rocks/:id/edit”,至:“rocks#update”
将“/rocks/:id/destroy”张贴到:“rocks#destroy”
词根至:“岩石#指数”
将“/login”改为“auth#login”,改为“login”
将“/login”发布到:“auth#authenticate”
获取“/logout”至:“auth#logout”```
因此,问题是**如何修复单击链接从该岩石的显示页面编辑岩石时出现的空参数错误**
@toodles从rails文档中,编辑路径是HTTP动词GET
您需要更改此行
,删除应用PUT HTTP谓词的method::patch
如果没有指定方法,rails将应用GET谓词,因此它应该看起来像这样
当您在浏览器中检查链接时,您将能够看到这一点
另外,由于您定义了资源:rocks
,因此不需要重新定义它下面的其他rock
路由。您可以在终端中使用rails routes
命令查看生成的路由
您还可以
向控制器添加编辑操作,该操作返回@rock
,您可以在编辑页面中使用该操作。在《Rails入门》一文中,我们清楚地展示了这一点 你能在show.rb中显示链接吗?应该是
啊,我刚才注意到你没有说出你的路线……`get'/rocks/:id/edit',to:“rocks#edit”,如:'edit#rock'
resources:rocks
应该给你命名的路线。@SteveTurczyn我在展示页面上有链接。它位于h2标记中所有内容的下方。@toodles您可以从“编辑路径”链接中删除method::patch吗?编辑路径是GET routes。我尝试了这个方法,现在我可以点击链接并进入编辑表单,但是当我点击submit时,我得到了错误No route matches[POST]“/rocks/7/Edit”
。我明白了,我需要在我的编辑表单中指定该方法为补丁。非常感谢你的帮助!太棒了@toodles!很乐意帮忙!