mits
June 13, 2010, 3:30pm
1
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:
Jak odczytać format json w respond_to ?
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.
mits
June 13, 2010, 5:33pm
3
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
hekto5
June 13, 2010, 6:09pm
5
@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.
mits
June 13, 2010, 6:09pm
6
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 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.
mits
June 13, 2010, 6:19pm
7
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
mits
June 13, 2010, 6:52pm
8
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