开发者

Path related problem in an attempt to save an array created by jQuery with a Rails 3 controller

开发者 https://www.devze.com 2023-03-10 12:13 出处:网络
I used \"p current_user\" in the controller to see if the jquery \"get\" is even getting to the appropriate action in the controller. It is not! Here\'s the code.

I used "p current_user" in the controller to see if the jquery "get" is even getting to the appropriate action in the controller. It is not! Here's the code.

Relevant portion of jquery code used to send the array (note the path):

      update: function(event, ui)
         {
         var sOrder = $(this).sortable('toArray');
         $.get('<%= update_strength_order_s_order_index_path %>', {'sOrder[]':sOrder});
         //  i confirmed this route using rake routes
   开发者_StackOverflow社区      }

The output to the console:

Started GET "/s_order/update_strength_order?sOrder%5B%5D=21&sOrder%5B%5D=7&sOrder%5B%5D=13&sOrder%5B%5D=12&sOrder%5B%5D=16&sOrder%5B%5D=9&sOrder%5B%5D=11&sOrder%5B%5D=18&sOrder%5B%5D=24&sOrder%5B%5D=8" for 127.0.0.1 at Sun Jun 05 01:47:29 -0400 2011

Route:

  resources :s_order do
    collection do
      post :update_strength_order
    end
  end

Relevant rake routes result:

update_strength_order_s_order_index

Error msg in the console:

The action 'show' could not be found for SOrderController

I've just transitioned to using jQuery and am having trouble with the path thing. Since it was a jQuery get, but really a rails post, i tried both in the route and that didn't change the end result. I've Googed everything i can think of with no solution. Thanks!


You will need to get the param values. (I also am using each_with_index and just one find method). I am assuming that you have a fixed number of sOrders for each user.

def update_strength_order

    sOrders = current_user.s_orders # In model: has_many :s_orders, :order => :position

    [*params['sOrder']].each_with_index do |value, index|
        str_order = index + 4 # starts with the fifth
        sOrder[str_order].update_attributes(:strength_id => value) unless sOrder[str_order].nil?
    end

    render :nothing => true
end

Suggestion

I would put this logic in the model. It is better practice to have skinny controller and fat models.

Your controller would look something like...

def update_strength_order
    current_user.reposition_strength_orders_to params['sOrder']           
    render :nothing => true
end

while the user model...

def User
    has_many :s_orders, :order => :position

    def reposition_strength_orders_to(sorder_ids=[])
       [*sorder_ids].each_with_index do |value, index|
           str_order = index + 4 # starts with the fifth  
           if s_orders[str_order].nil?
               #create a new s_order
           else
               s_orders[str_order].update_attributes(:strength_id => value) 
           end
       end
    end
end


You'll have to parse it out by hand

Something like:

vars = request.query_string.split("&")
sOrder = vars.map{|var| var.split("=")[1]}

EDIT

Okay forget what I said groan.

Just modify your JS to look like:

$.get('/test', {'x[]': [567,233,678]});
// in your case
$.get('<%= update_strength_order_s_order_index_path %>', {'sOrder[]':sOrder});

Not sure what's up with that path either update_strength_order_s_order_index_path so make sure that's correct too.

0

精彩评论

暂无评论...
验证码 换一张
取 消