Подтвердить что ты не робот

.js.erb VS.js

В чем преимущество использования javascript для вашего приложения rails в файле .js.erb вместо того, чтобы просто вставлять его в файл application.js? У меня есть кнопка создания для бизнеса, поэтому я должен поместить код в файл create.js.erb или поместить его в свой application.js, используя:

$("#business_submit").click(function() {}

Все, что в стороне, это то, что у меня есть кнопка создания

    $('.error').hide();
$("#business_submit").click(function() {
    // validate and process form here

    $('.error').hide();
    var name = $("input#business_name").val();
    if (name == ""  || name == "Required Field") {
        $('#namelabel').show()
        $("#business_name").focus();
        return false;
    }
    var address = $("#business_address").val();
    if (address == ""  || address == "Required Field") {
        $('#addresslabel').show();
        $("#business_address").focus();
        return false;
    }
    var city = $("#business_city").val();
    if (city == "" || city == "Required Field") {
        $('#citylabel').show();
        $('#business_city').focus();
        return false;
    }
    var state = $("#business_state").val();
    if (state == ""  || state == "Required Field") {
        $('#statelabel').show();
        $("#business_state").focus();
        return false;
    }
    var zip = $("#business_zip").val();
    if (zip == ""  || zip == "Required Field") {
        $('#ziplabel').show();
        $("#business_zip").focus();
        return false;
    }
    var phone = $("#business_phone").val();
    if (phone == ""  || phone == "Required Field") {
        $('#phonelabel').show();
        $("#business_phone").focus();
        return false;
    }

     var category = $("#business_business_category_id").val();
    if (category == " - Choose one - ") {
        $('#categorylabel').show();
        $("#business_business_category_id").focus();
        return false;
    }
    $("#new_business")[0].reset();
    $("#new_business").toggle();
   return false;
});

Это отлично работает в моем .js файле, но когда я нажимаю кнопку "Создать", он фактически не отправляет информацию, введенную в форму, в базу данных. Поэтому я попытался скопировать код в файл .js.erb. Теперь форма отправляется в базу данных при нажатии кнопки create, но половина javascript не работает. $('. Error'). Hide(); не скрывает мои ошибки, и все они появляются независимо. $( "# New_business" ) [0].RESET(); не переписывает мою форму, и нет никаких проверок проверки при нажатии кнопки create. Поэтому у меня либо есть полностью функциональная форма, которая не подает, либо подает, но не работает. С какой целью я должен работать?

Я вижу много кода с $.ajax, но я не могу понять его жизнь. Я попытался немного, и я начал получать некоторые ошибки защиты от подделки в рельсах, что представляет собой еще одну проблему.

4b9b3361

Ответ 1

.js.erb файлы предназначены для действий контроллера, например create, когда вы хотите, чтобы javascript выполнялся, когда действие завершено. Например, если вы хотите отправить форму через ajax и хотите отобразить предупреждение, когда все будет сделано, вы должны поставить

$('#business_submit').click(...)

в вашем приложении application.js или *.html.erb, и ваш файл create.js.erb может выглядеть следующим образом:

alert('New object id: ' + <%= new_object.id %>);

Таким образом, javascript, который возвращается в браузер, может быть впервые отображен Erb, что позволяет вам вставлять собственные строки/переменные/etc так же, как вы можете в шаблонах .html.erb.

Ответ 2

По моему мнению, причина, по которой файлы js.erb должны получить доступ к помощникам рельсов, например, к маршрутам something_url. В большинстве случаев я обнаружил, что эти URL-адреса уже встроены в тег <form> или что-то в этом роде, поэтому мне не нужно этого. Обработка всего с помощью .erb также не позволяет вам кэшировать javascript как агрессивно.

По этим причинам я считаю, что наиболее подходящее решение - поставить javascript в наиболее ненавязчивое место: application.js(или другие статические скрипты). Особенно с jQuery, это действительно так, как предполагалось.

Кстати, javascript_auto_include - хороший, аккуратный плагин для организации вашего javascript в соответствии с представления, которые отображаются. Вместо того, чтобы сбрасывать все в application.js, вы можете подумать об этом.

js.erb versus js.rjs

Один из этих двух (.erb) действительно предназначен для создания javascript из шаблона. Это то, что вы бы указали как тег в HTML. Другой (.rjs) - это управление содержимым страницы в ответе AJAX и не будет выполняться до тех пор, пока не будет выполнен такой вызов AJAXy.

Ответ 3

Если я могу внести свой вклад в мои небольшие цента...

Ответ на ваш вопрос очень прост:

  • Файл, заканчивающийся на *. js.erb, позволяет вашему файлу интерпретироваться рубином. (Таким образом, вы сможете использовать помощников рельсов)

  • Файл, заканчивающийся на *. js, является чистым javascript.

Вы никогда не получите файл *.js для работы, если вы поместите любой код ruby ​​внутри, например:

$(function () {
  new Highcharts.Chart({
    chart: { renderTo: 'orders_chart' },
    title: { text: <%= gon.my_title_of_the_day.to_json %> },
  });
})

Часть <%= gon.my_title_of_the_day.to_json %> будет просто генерировать ошибку, потому что javascript ничего не знает о ruby.

Чтобы ваш файл *.js работал, вам придется статически изменять его каждый раз, когда изменяется день:

$(function () {
  new Highcharts.Chart({
    chart: { renderTo: 'orders_chart' },
    title: { text: 'Monday' },
  });
})

NB. Если вы используете *.js.erb, вам потребуется дополнительно Gon "gem для передачи данных с вашего контроллера в JS.

Теперь для вашего основного вопроса "почему мой код javascript не работает" "Я не могу ответить, потому что я не эксперт по javascript, и это еще одна история...; -)