jQuery ajax + ror

Witam serdecznie,

mam do was jedno pytanie.
Trochę już bawię się w railsach - ogarnąłem podstawy, teraz przyszedł czas na stworzenie jakiegoś mini serwisu.

Niestety zaciąłem się na ajaxie mianowicie na wykonywaniem / przekazaniem przewnych rzeczy z controlera do js’a.
Np. korzystam z authlogic i podczas rejestracji chciałbym sprawdzić czy dany email został już użyty w serwisie czy też nie.

Widziałem to: http://railscasts.com/episodes/136-jquery
ale niestety nie pomogło mi to w rozwiązaniu problemu.

Obecnie mam zrobione to tak:

application.js

[code]jQuery.ajaxSetup({
‘beforeSend’ : function(xhr){
xhr.setRequestHeader(“Accept”, “text/javascript”)
}
});

$(document).ready(function(){
$(document).ajaxSend(function(event, request, settings){
if (settings.type == ‘GET’ || settings.type == ‘get’ || typeof(AUTH_TOKEN) == “undefined”) return;
settings.data = settings.data || “”;
settings.data += (settings.data ? “&” : “”) + “authenticity_token=” + encodeURIComponent(AUTH_TOKEN);
});

$(’#user_email’).blur(function(){
$.post(this.action, {email : $(this).val()}, function(data){
console.log(data)
}, ‘json’);
});
});[/code]
users_controller.rb

[code] def new
@user = User.new

respond_to do |format|
  format.html
  format.js {render :layout => false}
end

end[/code]
i moje pytanie brzmi:

  1. Jak odczytać format json w respond_to ?
  2. Jak zwrócić dane z respond_to do js’a np. true lub false w przypadku zajetosci maila ?

Dodam, że komunikacja js -> php działa.

Przeczytaj przewodnik Layouty i renderowanie, w szczególności o opcji :json w render.

hmm, użyłem render :json ale teraz mam kolejny błąd, a mianowicie:

[quote]POST http://localhost:3000/account/new 405 Method Not Allowed

ActionController::MethodNotAllowed
Only get requests are allowed.[/quote]
przy użyciu kodu:

[code]def new
@user = User.new

respond_to do |format|
  format.html
  format.json {render :json => @user}

end

end[/code]
mój plik new.html.erb:

<% form_for @user, :url => account_path, :html => {:method => :put} do |f| %> <%= f.error_messages %> <%= render :partial => "form", :object => f %> <%= f.submit "Register" %> <% end %>
macie jakieś pomysły ?

Musisz dodać w routes żeby dany url akceptował POST

@mits akcja new domyślnie akceptuje tylko zapytania GET, więc użyj $.get(). Z drugiej strony akcja new powinna służyć tylko do wyświetlenia formularza do dodania nowego użytkownika, więc może lepiej byłoby stworzyć dodatkową akcję wyspecjalizowaną w sprawdzaniu czy email został już użyty.

to akurat mialem od początku zrobione:

[code]ActionController::Routing::Routes.draw do |map|
map.resources :users, :new => { :new => :any }
map.resources :password_resets

map.resource :user_session
map.resource :account, :controller => “users”

map.root :controller => ‘statics’, :action => ‘home’
end[/code]
ale efekt jest taki jaki wyzej opisalem.

nie mam nic przeciwko :slight_smile: z tymzę jeśli stworzę nową akcje to i tak będe musiał ją wywołać podczas ładowania akcji new (bo na tej stronie sprawdzanie ma być dostępne) więc podejzewam ze problem sie powtórzy.

Co do $.get’a to mam także problem:

mając taki kod:

respond_to do |format| format.html format.json {render :json => @user, :content_type => 'text/javascript'} end
wywala mi:

jeżeli wywale format.html
to json mi się generuje ale w przeglądarce zastępując obecną stronę.

PS. mogę zastosować GET’a ale mimo wszystko chciałbym umieć zastosować post’a

oki $.get poszedl a właściwie $.ajax z typem GET:

jakby ktoś miał podobny problem:

[code] $.ajax({
type: “GET”,
url: this.action,
dataType: “script”,
data: {},

    beforeSend : function(xhr){
      xhr.setRequestHeader("Accept", "application/json")
    },

    success : function(data){
      console.log(data)
    },

    error: function(objAJAXRequest, strError, errorThrown){
      alert("ERROR: Type: " + strError);
    }
  }
);[/code]

zastanawia mnie jeszcze jedna rzecz a mianowicie ten nieszczęscny POST