Nathan
Nathan

Reputation: 61

Ruby on Rails: Need help updating db attribute in a nested route

Let me preface this by saying, i'm pretty new to rails and programming.

I'm trying to make some links to toggle a boolean attribute on and off. I've essentially succeeded in doing it on a non-nested resource by doing the following:

Route:

resources :my_resource do
 get 'toggle_attribute', :on => :member
end

Controller:

def toggle_attribute
  @resource = Resource.find(params[:id])
  @resource.toggle!(:attribute)
end

View: <%= link_to "Toggle Resource", toggle_attribute_resource_path(@resource), :remote => true %>

First, like I said above, this works on my non-nested route, however no matter what solution I try to add to the controller I can't get my link to flash a message or re-direct to anything when clicked, you click the button and nothing happens, you have to manually refresh to see the change.

Second, I can't figure out how to get this same sort of thing to work on a route that is nested like so:

Route:

resources :resource_1 do
resources :resource_2
end

Can anyone give me some tips?

Thanks a ton in advance. This stuff has been driving me batty.

Upvotes: 1

Views: 100

Answers (1)

flynfish
flynfish

Reputation: 5867

By using remote => true, you are telling it to make an ajax call. This means that you need to also add a toggle_attribute.js.erb file in your views folder and in that file use javascript to replace the link element or text with what you want.

Also make sure to respond to js by setting respond_to :html, :js at the top of your controller.

repond_to :html, :js
def toggle_attribute
  @resource = Resource.find(params[:id])
  @resource.toggle!(:attribute)
end

toggle_attribute.js.erb :

$('#toggler').html("my new html here");

in view:

<%= link_to "Toggle Resource", toggle_attribute_resource_path(@resource), :remote => true, :id => "toggler"%>

Update:

For your nested route try this:

resources :resource_1 do
  resources :resource_2 do
    member do
      get :toggle_attribute
    end
  end
end

your path would be something like:

toggle_attribute_resource_1_resource_2_path(@resource, @resource2)

Upvotes: 1

Related Questions