Parameters Sinatra:提交时参数散列中缺少表单数据
我正在用Sinatra编写一个相当基本的CRUD应用程序(这是一个CRUD应用程序,可以制作CRUD应用程序,值得一试)。“创建”功能工作正常,但“更新”功能不工作。控制器未接收参数散列中的表单数据。我可以看到在Chrome开发工具中收集的表单数据,但当它到达控制器时,参数散列看起来像Parameters Sinatra:提交时参数散列中缺少表单数据,parameters,sinatra,forms,http-post,Parameters,Sinatra,Forms,Http Post,我正在用Sinatra编写一个相当基本的CRUD应用程序(这是一个CRUD应用程序,可以制作CRUD应用程序,值得一试)。“创建”功能工作正常,但“更新”功能不工作。控制器未接收参数散列中的表单数据。我可以看到在Chrome开发工具中收集的表单数据,但当它到达控制器时,参数散列看起来像{“splat”=>[],“captures”=>[“23”],“id”=>“23”}而不是,例如,{“crudap”=>{“title”=>“Promises”,“description”=>“tbd”,“mod
{“splat”=>[],“captures”=>[“23”],“id”=>“23”}
而不是,例如,{“crudap”=>{“title”=>“Promises”,“description”=>“tbd”,“model”=>“Promise”},“columns”=>[{“key\u name”=>“name”,“data\u type”=>“String”}{“密钥名称”=>“说明”、“数据类型”=>“字符串”}、{“密钥名称”=>“履行”、“数据类型”=>“布尔”}]}
。我缺少什么?下面是相关代码
编辑.erb
<div class="entry-header">edit an app</div>
<form method="post" action="/crudapps/<%= @crudapp.id %>">
<input type="hidden" name="crudapp[user_id]" value="<%= @crudapp.user_id %>">
<ul class="basic-form">
<li>
<label for="crudapp[title]">Application title</label>
<input class="fieldbox" type="text" name="crudapp[title]" value="<%= @crudapp.title %>">
</li>
<li>
<label for="crudapp[description]">Description</label>
<textarea name="crudapp[description]"><%= @crudapp.description %></textarea>
</li>
<li>
<label for="crudapp[model]">Item name</label>
<input class="fieldbox" type="text" name="crudapp[model]" value="<%= @crudapp.model %>">
</li>
<input type="hidden" name="columns[0][id]" value="<%= @crudapp.columns[0].id %>">
<li>
<label for="columns[][key_name]">First attribute name</label>
<input class="fieldbox" type="text" name="columns[0][key_name]" value="<%= @crudapp.columns[0].key_name %>">
</li>
<li>
<label for="columns[0][data_type]">First attribute data type</label>
<select name="columns[0][data_type]">
<option value="String" <%= 'selected' if @crudapp.columns[0].data_type=='String' %>>String</option>
<option value="Number" <%= 'selected' if @crudapp.columns[0].data_type=='Number' %>>Number</option>
<option value="Date" <%= 'selected' if @crudapp.columns[0].data_type=='Date' %>>Date</option>
<option value="Boolean" <%= 'selected' if @crudapp.columns[0].data_type=='Boolean' %>>Boolean</option>
</select>
</li>
<input type="hidden" name="columns[1][id]" value="<%= @crudapp.columns[1].id %>">
<li>
<label for="columns[][key_name]">Second attribute name</label>
<input class="fieldbox" type="text" name="columns[1][key_name]" value="<%= @crudapp.columns[1].key_name %>">
</li>
<li>
<label for="columns[1][data_type]">Second attribute data type</label>
<select name="columns[1][data_type]">
<option value="String" <%= 'selected' if @crudapp.columns[1].data_type=='String' %>>String</option>
<option value="Number" <%= 'selected' if @crudapp.columns[1].data_type=='Number' %>>Number</option>
<option value="Date" <%= 'selected' if @crudapp.columns[1].data_type=='Date' %>>Date</option>
<option value="Boolean" <%= 'selected' if @crudapp.columns[1].data_type=='Boolean' %>>Boolean</option>
</select>
</li>
<input type="hidden" name="columns[2][id]" value="<%= @crudapp.columns[2].id %>">
<li>
<label for="columns[][key_name]">Third attribute name</label>
<input class="fieldbox" type="text" name="columns[][key_name]" value="<%= @crudapp.columns[2].key_name %>">
</li>
<li>
<label for="columns[2][data_type]">Third attribute data type</label>
<select name="columns[2][data_type]">
<option value="String" <%= 'selected' if @crudapp.columns[2].data_type=='String' %>>String</option>
<option value="Number" <%= 'selected' if @crudapp.columns[2].data_type=='Number' %>>Number</option>
<option value="Date" <%= 'selected' if @crudapp.columns[2].data_type=='Date' %>>Date</option>
<option value="Boolean" <%= 'selected' if @crudapp.columns[2].data_type=='Boolean' %>>Boolean</option>
</select>
</li>
<li>
<label for="crudapp[github]">GitHub link</label>
<input class="fieldbox" type="text" name="crudapp[github]" value="<%= @crudapp.github %>">
</li>
<li>
<label for="crudapp[web]">Web link</label>
<input class="fieldbox" type="text" name="crudapp[web]" value="<%= @crudapp.web %>">
</li>
</ul>
<div class="entry-submit-margin">
<input class="entry-submit" type="submit" value="submit">
</div>
</form>
编辑应用程序
-
申请名称
-
描述
-
项目名称
-
第一属性名
-
第一属性数据类型
一串
数
日期
布尔值
-
第二个属性名
-
第二属性数据类型
一串
数
日期
布尔值
-
第三属性名
-
第三属性数据类型
一串
数
日期
布尔值
-
GitHub链接
-
网络链接
应用程序\u controller.rb
class ApplicationController < Sinatra::Base
# lots of other routes omitted
post "/crudapps/:id" do
if logged_in?
@crudapp = Crudapp.find(params[:id])
if current_user.id == @crudapp.user_id
if !params[:crudapp] # This data is absent, so we always land here.
flash[:message] = "edit functionality is down!"
else
@crudapp.update(params[:crudapp])
params[:columns].each do |params_column|
column = Column.find_or_create_by(id: params_column[:id])
@crudapp.columns << @column.update(params_column)
end
end
redirect "/crudapps/#{@crudapp.id}"
else
flash[:message] = "you must be the app's creator to edit"
redirect "/crudapps"
end
else
flash[:message] = "please log in to edit an app"
redirect "/login"
end
end
end
类应用程序控制器 @crudapp.columns从Slack chat重温我们的解决方案
这部分HTML中缺少索引:
<li>
<label for="columns[][key_name]">Third attribute name</label>
<input class="fieldbox" type="text" name="columns[][key_name]" value="<%= @crudapp.columns[2].key_name %>">
</li>
希望这有帮助!好的,答案是我在一个输入标记的名称字段中遗漏了一个数组索引(2)。不过,我会发布一个问题的答案,因为它似乎指向一个更广泛的问题,因为可能其他人会有一个坏的params哈希问题,并且会在这里看到积极的结果。
$ curl --data-raw 'crudapp%5Buser_id%5D=1&crudapp%5Btitle%5D=Conundrum&crudapp%5Bdescription%5D=It%27s+uber+for+problem-solving%21%21%21+friend&crudapp%5Bmodel%5D=Problem&columns%5B0%5D%5Bid%5D=85&columns%5B0%5D%5Bkey_name%5D=summary&columns%5B0%5D%5Bdata_type%5D=String&columns%5B1%5D%5Bid%5D=86&columns%5B1%5D%5Bkey_name%5D=pros-and-cons&columns%5B1%5D%5Bdata_type%5D=String&columns%5B2%5D%5Bid%5D=87&columns%5B%5D%5Bkey_name%5D=solution&columns%5B2%5D%5Bdata_type%5D=String&crudapp%5Bgithub%5D=&crudapp%5Bweb%5D=' localhost:4567
{}
$ curl --data-raw 'crudapp%5Buser_id%5D=1&crudapp%5Btitle%5D=Conundrum&crudapp%5Bdescription%5D=It%27s+uber+for+problem-solving%21%21%21+friend&crudapp%5Bmodel%5D=Problem&columns%5B0%5D%5Bid%5D=85&columns%5B0%5D%5Bkey_name%5D=summary&columns%5B0%5D%5Bdata_type%5D=String&columns%5B1%5D%5Bid%5D=86&columns%5B1%5D%5Bkey_name%5D=pros-and-cons&columns%5B1%5D%5Bdata_type%5D=String&columns%5B2%5D%5Bid%5D=87&columns%5B2%5D%5Bkey_name%5D=solution&columns%5B2%5D%5Bdata_type%5D=String&crudapp%5Bgithub%5D=&crudapp%5Bweb%5D=' localhost:4567
{"crudapp"=>{"user_id"=>"1", "title"=>"Conundrum", "description"=>"It's uber for problem-solving!!! friend", "model"=>"Problem", "github"=>"", "web"=>""}, "columns"=>{"0"=>{"id"=>"85", "key_name"=>"summary", "data_type"=>"String"}, "1"=>{"id"=>"86", "key_name"=>"pros-and-cons", "data_type"=>"String"}, "2"=>{"id"=>"87", "key_name"=>"solution", "data_type"=>"String"}}}