Sinatra (CRUD 앱을 만드는 CRUD 앱입니다. 가치가있는 앱)입니다. 만들기 기능이 제대로 작동하지만 업데이트 기능이 작동하지 않습니다. 컨트롤러가 params 해시에서 양식 데이터를 수신하지 않습니다. Chrome Dev Tools에서 수집 된 양식 데이터를 볼 수 있지만 컨트롤러에 도달 할 때까지 매개 변수 해시는 (예 : {"crudapp"=>{"title"=>"Promises", "description"=>"tbd", "model"=>"Promise"}, "columns"=>[{"key_name"=>"name", "data_type"=>"String"}, {"key_name"=>"description", "data_type"=>"String"}, {"key_name"=>"fulfillment", "data_type"=>"Boolean"}]}
) 대신 표시됩니다. 내가 뭘 놓치고 있니? 아래 관련 코드.Sinatra : 제출시 params 해시에서 양식 데이터가 누락되었습니다.
edit.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>
application_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
그래, 대답은 내가 입력 태그 중 하나의 이름 필드에 배열 인덱스 (2)를 빠뜨린 것입니다. 더 많은 질문을 던지기 때문에 질문에 대한 답을 게시 할 것입니다. 누군가 다른 사람이 깨진 params 해시 문제를 가지고 여기에 긍정적 인 결과가 표시 될 것이기 때문입니다. –