2016-09-10 2 views
0

Ich habe eine Android App programmiert, die Profilbilder von einem Benutzer nehmen kann. Jetzt möchte ich dieses Profilbild auf meinen Ruby on Rail Server hochladen. Der Upload funktioniert jedoch nicht. Ich erhalte die Fehlermeldung:ActionController :: ParameterMissing (Parameter fehlt oder der Wert ist leer: Element):

app/controllers/items_controller.rb:55:in `item_params' 
    app/controllers/items_controller.rb:21:in `create' 
    Started POST "/items" for 192.168.3.7 at 2016-09-11 01:12:21 +0900 
    Processing by ItemsController#create as HTML 
     Parameters: {"image"=>#<ActionDispatch::Http::UploadedFile:0x5737110 @tempfile=#<Tempfile:C:/Users/Clemens/AppData/Local/Temp/RackMultipart20160911-2 
    8624-1vjbftr.jpg>, @original_filename="IMG_20160911_010525.jpg", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; na 
    me=\"image\"; filename=\"IMG_20160911_010525.jpg\"\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n">} 
    Completed 400 Bad Request in 0ms (ActiveRecord: 0.0ms) 

ActionController::ParameterMissing (param is missing or the value is empty: item): 

app/controllers/items_controller.rb:55:in `item_params' 
app/controllers/items_controller.rb:21:in `create' 

Warum funktioniert das nicht? Wie sollte mein item_params definiert werden? Hier ist meine items_controller.rb

class ItemsController < ApplicationController 
    before_action :set_item, only: [:show, :edit, :update, :destroy] 

    # GET /items 
    # GET /items.json 
    def index 
    @items = Item.all 
    end 

    # GET /items/1 
    # GET /items/1.json 
    def show 
    send_data(item.file_contents, 
       type: @item.content_type, 
       filename: @item.filename) 
    end 

    # POST /items 
    # POST /items.json 
    def create 
    @item = Item.new(item_params) 

    if @item.save 
     render :show, status: :created, location: @item 
    else 
     render json: @item.errors, status: :unprocessable_entity 
    end 
    end 

    # PATCH/PUT /items/1 
    # PATCH/PUT /items/1.json 
    def update 
    if @item.update(item_params) 
     render :show, status: :ok, location: @item 
    else 
     render json: @item.errors, status: :unprocessable_entity 
    end 
    end 

    # DELETE /items/1 
    # DELETE /items/1.json 
    def destroy 
    @item.destroy 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_item 
     @item = Item.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def item_params 
     #######################params.require(:item).permit(:name, :description, :picture) 
     params.permit(:picture) 
    end 
end 

UPDATE: Ich umbenannt mein Bild von Android-App und nannte es "Punkt". Jetzt verschwindet der Parameterfehler. Aber ein neuer Fehler tritt auf:

app/controllers/items_controller.rb:24:in `create' 
Started POST "/items" for 192.168.3.7 at 2016-09-11 10:25:26 +0900 
Processing by ItemsController#create as HTML 
    Parameters: {"item"=>#<ActionDispatch::Http::UploadedFile:0x53b1d30 @tempfile=#<Tempfile:C:/Users/Clemens/AppData/Local/Temp/RackMultipart20160911-3144-anlpp6.jpg>, @original_filename="IMG_20160911_100920.jpg", @co 
ntent_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"item\"; filename=\"IMG_20160911_100920.jpg\"\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n" 
>} 
Unpermitted parameter: item 
    (0.0ms) BEGIN 
    SQL (31.2ms) INSERT INTO `items` (`created_at`, `updated_at`) VALUES ('2016-09-11 01:25:26', '2016-09-11 01:25:26') 
    (0.0ms) COMMIT 
Completed 500 Internal Server Error in 62ms (ActiveRecord: 31.2ms) 



ActionView::MissingTemplate (Missing template items/show, application/show with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder]}. Searched in: 
    * "C:/Benutzer/Clemens/RubymineProjects/rails-api-fileupload-tutorial-carrierwave-single/app/views" 
): 

app/controllers/items_controller.rb:24:in `create' 

Irgendeine Idee, warum ich diesen Fehler bekomme? Ich habe in Aussicht folgende Zeile sowohl in Aussicht \ application \ show.json.jbuilder und in Ansichten \ Artikel \ show.json.jbuilder:

json.extract! @item, :locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :jbuilder] 

Allerdings habe ich immer noch die gleichen Fehler.

+0

'params.require (: Element) .permit (: Name,: Beschreibung,: Bild)' Warum ist das auskommentiert? – neo

+0

Ich bin mir ziemlich sicher, dass es nicht zu der Zeit war, als er diese Fehlermeldung sah! :) –

Antwort

2

Was passiert ist, dass diese Zeile:

params.require(:item).permit(:name, :description, :picture) 

wird eine Ausnahme ausgelöst, wenn Sie nicht auf ein Element in Ihrem params haben. Wenn Sie an Ihre Erstellungsaktion senden, haben Sie offensichtlich keinen Artikel. Ich nehme auch an, dass, wenn Sie diesen Fehler gesehen haben, Sie diese Linie nicht kommentiert haben.

+0

Ihre Annahme ist richtig. Nachdem mich dieser Fehler überraschte, habe ich diese Zeile kommentiert, weil ich nur ein Bild und keinen Namen oder eine Beschreibung sende. Also muss ich mein Bild umbenennen, das ich von meiner Android-App aus sende, nenne es "Gegenstand" und das Problem ist gelöst? – Peter

+0

Ich habe mein Bild in "Elemente" umbenannt, siehe UPDATE in meinem Beitrag. Irgendetwas stimmt immer noch nicht mit meinen Parametern. Ich weiß nicht, wie Ruby on Rails die von Android gesendeten Parameter verwenden kann. Ich weiß nicht, was ich tun soll – Peter

+0

Artikel ist nicht dasselbe wie Artikel. Sie können einen Parameter namens item mit den folgenden drei Feldern senden: name,: description und: picture. Alle zusätzlichen Felder auf dem Element oder einem beliebigen Element, das nicht als Element bezeichnet wird, sind geradlinig. –

Verwandte Themen