@caution

Как убрать возможность перехода к экшенам, которые работают с помощью ajax + json, через строку браузера?

В общем ниже мой код который реализует подгрузку формы добавления book, с помощью ajax и json, проблема в том что если перейти через браузер по пути host_hame/books/new то браузер рендерит то что возвращает new action:
21ebea00f64b4a56a92356d39b54c8ca.png
Кто подскажет как предотвратить рендеринг этого экшена при переходе через строку в браузере ?
index.html.erb
<%= link_to 'New Book', new_book_path, remote: true, class:"new_book" %>
<div class="lol"></div>

books_controller.rb
def new
    @book = Book.new
    form_html = render_to_string( :partial => 'books/form', :formats => [:html], :locals => { :book => @book } )
    render :json => { :form_html => form_html }
  end

book.js
$(document).on('ajax:success', '.new_book', function(e, data, textStatus, xhr) {
	$('.lol').append(data.form_html)
})

У меня есть идея сделать это так:
books_controller.rb
def new
    @book = Book.new
    form_html = render_to_string( :partial => 'books/form', :formats => [:html], :locals => { :book => @book } )
    respond_to do |format|
      format.json { render :json => { :form_html => form_html } }
      format.html { redirect_to root_path }
    end
  end

Но мне кажется это не очень красиво, и правильно. И вообще целесообразно ли рендерить такие формы через обычный render и хайдить c помощью jQuery ?
  • Вопрос задан
  • 2529 просмотров
Пригласить эксперта
Ответы на вопрос 5
keksmen
@keksmen
Just a programmer
Думаю, вам стоит просто поменять в конфиге модуля-роутера метод http с GET на POST. Это автоматом отсеет большинство любопытных пользователей.
Ответ написан
Комментировать
Не знаю я рубей, но алгоритм очень простой.
Перед выводом достаточно проверить, действительно ли запрос является ajax'ом.
Похоже, что тут ваше решение: stackoverflow.com/questions/366311/how-do-you-hand...
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Тут вот прочитайте
railsadventures.wordpress.com/2012/10/07/routing-o...
Ответ написан
Комментировать
@mayorovp
Такой вопрос: собственно, зачем вам это нужно? В чем заключается проблема отображения этих джейсонов в браузере? Просто не оставляйте ссылок на них - и их никогда не увидят обычные пользователи.
Ответ написан
Можно в роутинге прописать (ну или как-то так)
match 'url' => 'controller#method', :constraints => { :only_ajax => true }


Можно в контроллере
class BooksController < ApplicationController
  before_action :access_check, only:[:new]
  def new
    @book = Book.new
    form_html = render_to_string( :partial => 'books/form', :formats => [:html], :locals => { :book => @book } )
    render :json => { :form_html => form_html }
  end
  private
    def access_check
      unless request.xhr?
         redirect_to :root_path
      end
    end
end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы