4

I have got a task to do knockout.js using ruby on rails. I want to send the javascript value to the controller. My index.html.erb is

<%= javascript_include_tag "knockout-2.2.0","country-state" %>
<table>
    <thead>
        <tr>
            <th>Country</th>
            <th>State</th> 
            <th> </th>
        </tr>
    </thead>
    <tbody data-bind='foreach: lines'>
        <tr>
            <td>
                <select data-bind='options: sampleProductCategories, optionsText: "country", optionsCaption: "Select...", value: category'> </select>
            </td>
            <td data-bind="with: category">
                <select data-bind='options: products, optionsText: "country", optionsCaption: "Select...", value: $parent.product'> </select>
            </td>



            <td>
                <a href='#' data-bind='click: $parent.removeLine'>Remove</a>
            </td>
        </tr>
    </tbody>
</table>

<button data-bind='click: addLine'>Add</button>
<button data-bind='click: save'>Submit</button>

<script>
$(document).ready(function() {
function formatCurrency(value) {
    return "$" + value.toFixed(2);
}

var CartLine = function() {
    var self = this;
    self.category = ko.observable();
    self.product = ko.observable();

    self.subtotal = ko.computed(function() {
        return self.product() ? self.product().price * parseInt("0" + self.quantity(), 10) : 0;
    });

    // Whenever the category changes, reset the product selection
    self.category.subscribe(function() {
        self.product(undefined);
    });
};

var Cart = function() {
    // Stores an array of lines, and from these, can work out the grandTotal
    var self = this;
    self.lines = ko.observableArray([new CartLine()]); // Put one line in by default
    self.grandTotal = ko.computed(function() {
        var total = 0;
        $.each(self.lines(), function() { total += this.subtotal() })
        return total;
    });

    // Operations
    self.addLine = function() { self.lines.push(new CartLine()) };
    self.removeLine = function(line) { self.lines.remove(line) };
    self.save = function() {
        var dataToSave = $.map(self.lines(), function(line) {
            return line.product() ? {
                state: line.product().country
            } : undefined
        });
        alert("Could now send this to server: " + JSON.stringify(dataToSave));
        $.ajax({
    url: '/employees/<%[email protected]%>',
    dataType: 'json',
    async: false,
    method:'PUT',
    data:dataToSave,
    success: function(data) {

    }
    });
    };
};

ko.applyBindings(new Cart());
});
</script>

In the terminal it shows like

Started GET "/employees/1?undefined=undefined" for 127.0.0.1 at Mon Jan 21 13:36:15 +0530 2013
Processing by EmployeesController#show as JSON
  Parameters: {"id"=>"1", "undefined"=>"undefined"}

How to send the selected state and country to the controller as json object?

2 Answers 2

5

Just try this.

 $.ajax({
      url:'/employees/<%[email protected]%>',
      dataType: 'json',
      data: { passval: dataToSave},
      success: function(msg) 
           { 

           }
       });

you can use the variable passval in the ajax page for retrieving the value of dataTosave,
and the variable msg will return the response from the ajax.

Sign up to request clarification or add additional context in comments.

Comments

1

Any ajax http call will do.

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
  }
});

or

    $.getJSON(muUrl, myData, function(data) {
  //stuff
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.