2017-01-11 12 views
0

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 
+0

그래, 대답은 내가 입력 태그 중 하나의 이름 필드에 배열 인덱스 (2)를 빠뜨린 것입니다. 더 많은 질문을 던지기 때문에 질문에 대한 답을 게시 할 것입니다. 누군가 다른 사람이 깨진 params 해시 문제를 가지고 여기에 긍정적 인 결과가 표시 될 것이기 때문입니다. –

답변

0

느슨하게 채팅에서 우리의 솔루션을 재현하면서!

<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> 

입력 태그의 이름 속성이 있어야한다 columns[2][key_name] (는 2 실종) :

는 HTML의이 부분에서 누락 인덱스가 있습니다. 이로 인해 쿼리 매개 변수 문자열이 분석 할 수 없게되어 Rack이 일종의 바이너리 또는 비표준 형식이라고 가정하고 대신 request.body이라는 핸들러로 전달합니다.

나는 다시 요청자에게 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"}}} 

희망!