2016-11-22 4 views
-2

Ich bin neu in Rails und versuche, eine Anwendung zu erstellen, die eine Benutzeranforderung annimmt. Dies ist jedoch der Fall, wenn ich versuche, eine neue Anfrage zu erstellen.Rails nomethod Fehler

Anfrage Controller:

class RequestsController < ApplicationController 
    before_action :set_request, only: [:show, :edit, :update, :destroy] 

    # GET /requests 
    # GET /requests.json 
    def index 
    @requests = Request.all 
    end 

    # GET /requests/1 
    # GET /requests/1.json 
    def show 

    end 

    # GET /requests/new 
    def new 
    @request = Request.new 

    end 

    # GET /requests/1/edit 
    def edit 
    end 

    # POST /requests 
    # POST /requests.json 
    def create 
    @request = Request.new(request_params) 

    respond_to do |format| 
     if @request.save # <-------------- The problem is here 
     format.html { redirect_to @request, notice: 'Request was successfully created.' } 
     format.json { render :show, status: :created, location: @request } 
     else 
     format.html { render :new } 
     format.json { render json: @request.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /requests/1 
    # PATCH/PUT /requests/1.json 
    def update 
    respond_to do |format| 
     if @request.update(request_params) 
     format.html { redirect_to @request, notice: 'Request was successfully updated.' } 
     format.json { render :show, status: :ok, location: @request } 
     else 
     format.html { render :edit } 
     format.json { render json: @request.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /requests/1 
    # DELETE /requests/1.json 
    def destroy 
    @request.destroy 
    respond_to do |format| 
     format.html { redirect_to requests_url, notice: 'Request was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def request_params 
     params.require(:request).permit(:user_id, :description, :created) 
    end 
end 

Der Fehler sagt, dass es keine "Create" ist Controller-Methode in den Anfragen, aber die Methode, die dies sagt, die Methode erstellen ist. Ich denke, dass ein Problem darin besteht, dass meine Ansicht die Beschreibung nicht als Parameter weitergibt und ich bin mir nicht sicher, wie ich das tun soll/warum es nicht schon so ist.

_form.html.erb (von edit.html.erb Rendered):

%= form_for(@request) do |f| %> 
    <% if @request.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@request.errors.count, "error") %> prohibited this request from being saved:</h2> 

     <ul> 
     <% @request.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <center> 
    <div class="field"> 
    <%= f.label 'Describe your favor' %><br> 
    <%= f.text_area :description %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
    </center> 
<% end %> 

Wenn jemand mir zeigen konnte, wie die Beschreibung Objekt als Parameter an meine erstellen Methode zu übergeben und die Methode erhalten nicht zusammenbrechen. Hier

ist das Fehlerprotokoll:

NoMethodError (undefined method `Request' for #<Request:0x007f9fbd8992e8>): 
    app/controllers/requests_controller.rb:32:in `block in create' 
    app/controllers/requests_controller.rb:31:in `create' 


    Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_source.erb (6.9ms) 
    Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.8ms) 
    Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.9ms) 
    Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (29.4ms) 
+1

Der Fehler besagt nicht, dass es keine 'create' Methode gibt. Es besagt, dass es keine Methode namens "Request" gibt. Was ist der Wert von 'request_params'? –

+0

Es sollte die '' Beschreibung' 'sein, die der Benutzer einreicht. Es wird als '@ request = Request.new (request_params)' – CS2016

+1

verwendet. Wenn die Dinge immer so waren, wie sie sein sollten, hätten wir nie Fehler. Was ist der * tatsächliche * Wert? –

Antwort

2

Mit Request (oder Response) als Name eines Modells ist nicht eine sehr gute Idee, da Sie die request object Shadowing enden. Welches ist ein Kernstück von Rails-Controllern.

Es macht es auch sehr verwirrend, über Ihren Code zu denken, da es mit einem Kernkonzept in MVC und Web-Entwicklung im Allgemeinen kollidieren wird.

Verwenden Sie eine thesaurus und suchen Sie einen anderen Namen für Ihr Modell.

+0

Wenn Sie wirklich 'Request' verwenden müssen, dann rufen Sie Ihre Variable' @ the_request' auf und lösen Sie sie immer vom Basis-Namespace ':: Request', um Kollisionen zu vermeiden. Aber das stinkt nur nach schlechtem Design. – max