2010-10-06 10 views
31

mam tej konfiguracji:Jak określić ": layout => false" w Rails "respond_with?

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 

    def index 
    @users = User.all 
    respond_with(@users) 
    end 
end 

Teraz staram się zrobić to tak, jeśli params[:format] =~ /(js|json)/, render :layout => false, :text => @users.to_json. Jak to zrobić z respond_with lub respond_to i inherited_resources?

+0

tylko domysły, ale może 'renderowanie FALSE? – Trip

Odpowiedz

44

Coś jak:

def index 
    @users = User.all 
    respond_with @users do |format| 
    format.json { render :layout => false, :text => @users.to_json } 
    end 
end 
17

lub zapobiec konieczności hardcode odpowiedzi dla każdego formatu w każdej akcji.

Jeśli nie masz układów dla któregokolwiek z działań w tym kontrolerze byłoby ładniej zrobić:

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 
    layout false 

    def index 
    @users = User.all 
    respond_with(@users) 
    end 
end 
+0

W szynach 3 układ użycia: false - zero spowoduje załadowanie domyślnego układu. Zobacz: http://stackoverflow.com/a/11355276/398696 – d3vkit

28

Zakładając trzeba JSON dla żądania Ajax

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 

    def index 
    @users = User.all 
    respond_with(@users, :layout => !request.xhr?) 
    end 
end 

to wydaje się, że najczystsze rozwiązanie dla mnie.

8

kocham @ rozwiązania Anthony, ale nie działa dla mnie ... musiałem zrobić:

respond_with(@users) do |format| 
    format.html { render :layout => !request.xhr? } 
end 

PS: delegowania „odpowiedź” zamiast komentarz bo stackoverflow komentarz formatowanie i " klucz powrotny == submit "jest irytujący!

1

Musisz ustawić to w swojej akcji pokazowej.

def show 
    render :layout => !request.xhr? 
end 

:)

4

Właśnie znalazłem na to uwagę:

Nawet jeśli to JSON, Rails wciąż szuka układu. Jako jedyny układ, który znajduje się w naszym przypadku, to application.html.

Rozwiązanie: Utwórz układ JSON.

Na przykład, jeśli wstawisz pusty application.json.erb z pojedynczym = yield wewnątrz, obok kodu HTML, układ HTML zostanie poprawiony przez JSON. Możesz nawet użyć tego, aby otoczyć JSON metadanymi lub podobnymi rzeczami.

<%# app/views/layouts/application.json.erb %> 

<%= yield %> 

Brak innych parametrów, automagicznie działa!

Testowany w Rails 4 tylko

+0

Testowany w Rails 3, działa dobrze. Chociaż nie jest to odpowiedź na zadane pytanie, wciąż jest odpowiedzią na pytanie, które wielu z nas ma na myśli. – lifecoder

+0

Działa dla mnie w Rails 4. Prosty i prosty. – emptywalls

+2

Właśnie sprawdziłem w Railsach 4.2. Jeśli nazwiesz plik układu 'application.html.slim', nie będzie on traktowany jako plik układu dla json; ktokolwiek, jeśli nazwiesz plik układu jako 'application.slim' ..wtedy * będzie * traktowane jako plik układu dla JSON. (wymień slim z erbem powinien zrobić to samo). – songyy

3
class UsersController < InheritedResources::Base 
    layout -> (controller) { controller.request.xhr? ? false : 'application' } 
end 
Powiązane problemy