2016-11-22 3 views
-2

Я новичок в Rails и пытаюсь создать приложение, которое принимает запрос пользователя. Однако это то, что происходит, когда я пытаюсь создать новый запрос.Rails nomethod error

Запрос Контроллер:

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 

ошибка говорит, что нет никакого метода «Создать» в контроллере запросов, однако метод, который говорит, что это метод создания. Я думаю, что проблема в том, что мое представление не передает описание в качестве параметра, и я не уверен, как это сделать/почему его еще нет.

_form.html.erb (Вынесено по edit.html.erb):

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

Если кто-то может показать мне, как передать объект описания в качестве параметра для моего метода создания и получить метод чтобы не потерпеть крах.

Вот журнал ошибок:

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

Ошибка не говорит о том, что метода 'create' нет. В нем говорится, что нет метода под названием «Запрос». Какова ценность 'request_params'? –

+0

Это должно быть ': description', которое пользователь представляет. Он используется как '@request = Request.new (request_params)' – CS2016

+1

Если бы все было так, как должно быть, у нас никогда не было бы ошибок. Что такое * актуальная * ценность? –

ответ

2

Используя запрос (или ответ) в качестве имени модели не очень хорошая идея, так как вы будете в конечном итоге затенения request object. Это основная часть контроллеров Rails.

Это также очень смущает причину вашего кода, поскольку он столкнется с основной концепцией в MVC и веб-разработкой в ​​целом.

Используйте thesaurus и найдите другое название для своей модели.

+0

Если вам действительно нужно использовать 'Request', тогда вызывайте переменную' @ the_request' и всегда разрешайте ее из базового пространства имен ':: Request', чтобы избежать столкновений. Но это просто воняет плохим дизайном. – max

Смежные вопросы