2014-09-14 4 views
3

У меня есть этот метод контроллера:Jquery Ajax и контроллер метод

def create 
    render plain: params[:article].inspect 
    #@article = Article.new(article_params) 

    #@article = Article.create(article_params) 
    #if @article.save 
    # redirect_to @article  
    #else 
    # render 'new' 
    #end 
end 

И этот запрос JQuery Ajax:

function ajaxsend() { 

    $.ajax({ 
    url: "/articles", 
    type: "POST", 
    data: { "article": { "title": "acme", "text": "text of the article" } }, 
    success: function(resp){ } 
    }); 

} 

Но после того, как я нажимаю кнопку, запуск электронной JQuery Ajax Я ничего не получаю. Я ожидаю рендеринг, но ничего не происходит, даже ошибка в консоли. Что я делаю неправильно? Я не понимаю, как я могу отправить данные jQuery ajax в контроллер. Любая помощь? Я новичок в рубинах по разработке рельсов. Ruby версия: 2.1.2; Версия Rails: 4.1.5;

Edit1:

Он хорошо работает, когда я делаю это традиционным способом в виде:

enter image description here

Результат:

enter image description here

Edit2 :

сервер печатает WEBrick это, когда я нажимаю кнопку:

Started POST "/articles" for 127.0.0.1 at 2014-09-14 09:43:36 +0100 
Processing by ArticlesController#create as */* 
    Parameters: {"article"=>{"title"=>"acme", "text"=>"123 Carrot Street"}} 
    Rendered text template (0.0ms) 
Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.0ms) 

кажется нормально. Почему в браузере ничего не происходит? Почему рендер в методе создания не работает? Любая помощь?

WEBrick ответ, когда я заполнить форму и нажмите кнопку Создать статью:

Started POST "/articles" for 127.0.0.1 at 2014-09-14 09:52:21 +0100 
Processing by ArticlesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"o8bzaGFcWGaHFFEbgZsfx5bWiHDAIaX3j4xXh3XkTwc=", "article"=>{"title"=>"mmmmm", "text"=>"mmmmm"}, "commit"=>"Create Article"} 
    Rendered text template (0.0ms) 
Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.0ms) 

EDIT3:

Я также попробовал так:

$.post("/articles", { "article": { "title": "Title1Ar", "text": "text of the article" } }, alert("callback"), "json").error(alert("error handler")); 

это в WEBrick:

Started POST "/articles" for 127.0.0.1 at 2014-09-15 09:19:49 +0100 
Processing by ArticlesController#create as JSON 
    Parameters: {"article"=>{"title"=>"firsttitle", "text"=>"text of the article"}} 
    Rendered text template (0.0ms) 
Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms) 

, но в браузере снова ничего не происходит. Любая помощь?

+0

Вы пробовали добавлять 'удаленный: true' в качестве опции в виде помощника? Это превратит POST в запрос AJAX для вашего действия 'create' или' update' в контроллере. Затем вы можете создать файл 'create.js.erb' в папке вида' articles', и он запустит этот JS. – kobaltz

+0

Я проделал эту простую форму, чтобы понять, как я могу вызвать метод создания строки с помощью jQuery ajax-запроса. Потому что у меня есть инструмент javascript, разработанный для рисования диаграмм, но в конце я хочу сохранить все данные диаграммы. Я сделал это на PHP, но теперь я должен сделать это в рубине на приложении rails. Подводя итог, я должен сохранить json-объект на сервере. – Mario

+1

Похоже, что он должен отправить запрос, хотя вы не увидите никакого ответа в браузере. Вы упоминаете, что не видите ошибку в консоли, ссылаетесь ли вы на консоль Rails (при условии, что вы используете сервер WEBrick) или консоль javascript в браузере? Firebug в Firefox незаменим для отладки таких вещей. – Jim

ответ

2

Я делаю AJAX вызов, как это, вы можете попробовать:

$("#test-ajax-controller").on("click", function() { 
    request = void 0; 
    request = $.ajax({ 
    url: "/articles/create/?title=acme&text=123 Carrot Street" 
    }); 
    request.done(function(data, textStatus, jqXHR) { 
    console.log(data); 
    }); 
    request.error(function(jqXHR, textStatus, errorThrown) { 
    alert("AJAX Error:" + textStatus); 
    }); 
}); 

И в контроллере вы должны ответить в JSON

respond_to do |format| 
    format.json { render json: @your_return_object } 
end 
0

кажется нормально. Почему в браузере ничего не происходит?

Поскольку вы не создали никаких функций для обработки ответа.

Всякий раз, когда вы отправляете запросы Ajax, вы получите всегда получите ответ. Этот ответ - это то, что вам нужно учитывать при написании вашего javascript.Я подробно немедленное исправление для вас, а затем более системного исправления, которое установит вам на лучшем пути:


Ajax

В соответствии с текущей настройкой, вы хотите для получения данных, используя следующие данные:

#app/assets/javascripts/application.js 
function ajaxsend() { 

    $.ajax({ 
    url: "/articles", 
    type: "POST", 
    data: { "article": { "title": "acme", "text": "123 Carrot Street" } }, 
    success: function(resp){ 
     alert("Data"); 
    } 
    }); 

} 

«Предупреждение» в этом случае - это то, что создаст нужные вам эффекты. Чтобы сделать эту работу правильно, вам придется использовать свой собственный код (я не знаю, чего вы пытаетесь достичь).

Следует также отметить, что вам придется связать этот ajax код с события в ваших JS:

#app/assets/javascripts/application.js 
$(document).on("submit", "form", function() { 
     $.ajax({ 
     url: $(this).attr("action"), 
     type: "POST", 
     data: $(this).serialize(), 
     success: function(resp){ 
      alert("Data"); 
     } 
     }); 
}); 

UJS

С Rails, мы» очень повезло, что у вас есть драйвер Rails UJS, который предоставляет ряд функций для наших Rails-приложений, которые мы будем использовать неявно (IE без необходимости k eep определяющие функции).

Вы можете увидеть Rails UJS Ajax functionality here

В частности, вы будете в состоянии сделать это:

#app/views/articles/new.html.erb 
<%= form_for @article, remote: true do |f| %> 

#app/controllers/articles_controller.rb 
class ArticlesController < ApplicationController 
    respond_to :js, :json, :html 

    def create 
     @article = Article.new article_params 
     @article.save 

     respond_with @article 
    end 

    private 

    def article_params 
     params.require(:article).permit(:title, :text) 
    end 
end 

#app/assets/javascripts/application.js 
$(document).on("ajax:success", "form", function(status, data, xhr){ 
    alert("DATA RECEIVED"); 
}); 
+0

Спасибо @RichPeck! С примером в вопросе я просто пытаюсь выяснить, как сохранить объект json. У меня есть инструмент javascript для рисования диаграмм, которые в конце генерируют объект json, и я хочу его сохранить. У меня нет формы, у меня просто есть json, который нужно сохранить в базе данных. В этом простом примере я пытаюсь выяснить, как это сделать, пытаясь спасти простой json-объект (статью) с помощью jquery ajax. Есть ли другой способ сделать это? Я думаю, что способ UJS не делает то, что я хочу, потому что у меня нет формы. – Mario

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