使用 link_to 切换布尔值

Ric*_*ton 2 ruby-on-rails link-to ruby-on-rails-3

我已阅读相关的堆栈问题,但似乎仍然遇到路由错误,代码如下:

路线.rb

resources :memberships do
  put :toggleon
  put :toggleoff
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

显示.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 %>
Run Code Online (Sandbox Code Playgroud)

错误文本

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

ActionController::RoutingError (No route matches "/memberships/13"):
Run Code Online (Sandbox Code Playgroud)

我可以很好地销毁会员资格,但切换会员资格活动却很棘手。

提前致谢!

第二次尝试

                  <%= 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") %>
Run Code Online (Sandbox Code Playgroud)

def toggle
   @membership = Membership.find(params[:id])
   @membership.toggle!(active)
end
Run Code Online (Sandbox Code Playgroud)

resources :memberships do
   member do
      put :toggle
   end
end
Run Code Online (Sandbox Code Playgroud)

现在给我这个错误...

undefined method `membership_toggle' for #<#<Class:0x00000102e69bc0>:0x00000102e66ec0>
Run Code Online (Sandbox Code Playgroud)

Pet*_*ete 5

使用您的路线的链接将是:

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")
Run Code Online (Sandbox Code Playgroud)

您需要提供:method => :put给 link_to 方法,因为这就是您的路由文件中的路由。

类似这样的事情可以通过一个动作来实现:

resources :memberships do
  member do
    put :toggle
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过 Rails切换方法来使用控制器中的单个布尔字段。

这会让你做类似的事情:

@membership.toggle(:on)
Run Code Online (Sandbox Code Playgroud)