Переключение логического с link_to - PullRequest
1 голос
/ 28 сентября 2011

Я прочитал соответствующие вопросы по стеку, но, похоже, все еще сталкиваюсь с ошибкой маршрутизации со следующим кодом:

Routes.rb

resources :memberships do
  put :toggleon
  put :toggleoff
end

Memberships_controller.rb

 def toggleon
    @membership = Membership.find(params[:id])
    @membership.update_attributes(:active => true)
    if user.id == membership_id 
       redirect_to root_path
    else
       redirect_to group
    end
 end

 def toggleoff
    @membership = Membership.find(params[:id])
    @membership.update_attributes(:active => false)
          if user.id == membership_id 
       redirect_to root_path
    else
       redirect_to group
    end
 end

Show.html.erb

  <% if this_membership.active %>
    <%= link_to 'Pause', this_membership, controller: :memberships, method: :toggleoff, style: 'color:#ccc' %>
  <% else %>
    <%= link_to 'Start', this_membership, controller: :memberships, method: :toggleon, style: 'color:green' %>
  <% end %>

Текст ошибки

Started POST "/memberships/13" for 127.0.0.1 at 2011-09-27 23:35:35 +0100

ActionController::RoutingError (No route matches "/memberships/13"):

Я могу просто уничтожить членство, но переключение активности членства оказывается сложным.

Заранее спасибо!

Вторая попытка

                  <%= link_to("Pause", membership_toggle(@membership), :method => :put, :title => "This toggles it off") %>
                  <% else %>
                  <%= link_to("Toggle On", membership_toggle(@membership), :method => :put, :title => "This toggles it on") %>

и

def toggle
   @membership = Membership.find(params[:id])
   @membership.toggle!(active)
end

и

resources :memberships do
   member do
      put :toggle
   end
end

теперь выдает мне эту ошибку ...

undefined method `membership_toggle' for #<#<Class:0x00000102e69bc0>:0x00000102e66ec0>

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011

Ссылки с использованием ваших маршрутов будут:

link_to("Toggle On", membership_toggleon_url(membership), :method => :put, :title => "This toggles it on")
link_to("Toggle Off", membership_toggleoff_url(membership), :method => :put, :title => "This toggles it off")

Вам необходимо указать :method => :put для метода link_to, учитывая, что у вас есть такой же маршрут, как в вашем файле маршрутов.

Примерно так можно добиться одним действием:

resources :memberships do
  member do
    put :toggle
  end
end

Затем вы можете использовать единственное логическое поле в вашем контроллере, используя метод Rails toggle .

Это позволит вам сделать что-то вроде:

@membership.toggle(:on)
2 голосов
/ 28 сентября 2011

Попробуйте установить маршрут как :on => :member.

Кроме того, есть атомарный метод toggle!, который делает то, что подразумевает его название.

1 голос
/ 02 октября 2011

Имеет проблемы с различными техниками, но в конце концов нашел эту статью:

http://buckybits.blogspot.com/2011/09/simple-ajax-property-toggle-in-rails-30.html

BOOM!

...