2014-03-03 3 views
0

это мой раздел Ajax вызова в JS файла:Как передать JSON ответа от контроллера Аякса вызова в рельсах

$("#sign_submit").click(function(){ 
      email_id = $("#user_email").val(); 
      password = $("#user_password").val(); 

      data = {email: email_id, password: password }; 
      url = user/sign_in'; 

      $.ajax({ 
       url: url, 
       data: data, 
       cache: false, 
       type: "post", 
       success: function(data){ 
        console.log(data); 
       } 
       }); 
}); 

Это мой контроллер Действие:

def create 
    @user = User.find_by_email(params['email']) 
    if @user.nil? 
     respond_to do |format| 
     format.json {render :json => {:response => 'User is invalid'} }  #how to pass json response here. 
     end 
    end 

    if @user.check_valid_user?(params['password']) 
     set_dashboard_location 
     set_current_user(session[:customer_id]) 
     render js: %(window.location.href='#{session["spree_user_return_to"]}') 
    else 
     #redirect_to '/' and return 
     #how to psas json response here. 
    end 
    end 

В в создании действия (else), мне нужно передать ответ json относительно (недопустимых прав пользователя/недопустимых учетных данных пользователя) на мой вызов ajax, который я могу предупредить пользователя на странице просмотра.

ответ

5

Мне трудно понять, где проблема, но я сделаю все возможное, чтобы помочь вам.

Базовая команда для отображения JSON из контроллера рельсов

render json: @user 

, например. Я видел, что ты написал что-то подобное, но внутри определенного блока. Когда вы пишете

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

Рендеринг JSON будет происходить только тогда, когда URL для запроса завершается на .json (формат запроса) Так вот url = user/sign_in.json воздаст JSON, но url = user/sign_in примет формат является HTML (формат по умолчанию, который вы можете изменить в определениях маршрутов) и ничего не будет отображать.

Если вам нужно визуализировать json независимо от URL-адреса. Не кладите его в блок respond_to. Если вам нужно 2 различных поведения если это вызов Ajax или другой вызов, используйте URL foo/bar.json

Если запустить rake routes в корневой папке рельсов, вы увидите URLs как /users/sign_in(.:format), это означает, что /users/sign_in.toto установит :format в toto

Надеюсь, это было ясно! Если вы хотите установить формат по умолчанию в маршрутах:

How to set the default format for a route in Rails?

+1

Я понимаю ваше объяснение. И попытался просто передать @user в json:, но когда он равен нулю, он должен выполнить наш if block & return nil в мой файл ajax. , но в действительности он не возвращает значение nil для моего ajax. как передать это значение nil ajax? – Ajay

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