Rails视图上的多个链接,每个链接执行不同的操作 - 如何最好地处理这个?

时间:2009-01-08 20:37:46

标签: ruby-on-rails

我正在做的其中一件事包括 show 视图中的几个链接。例如,我有一个“接受”的链接(或按钮),另一个用于“拒绝”。单击Accept,模型将is_accepted字段更新为true,单击Reject,is_accepted字段为false。

现在,我该如何处理这个问题?在ASP.NET中,我会简单地创建一个LinkBut​​ton并编写一个处理程序,但是Rails不会那样工作,所以我试图找出如何基本上复制一个LinkBut​​ton会做什么。

现在,我在同一个视图上编写两个表单,几乎相同,看起来像这样:

<%= form_for @thing do |f| %>
  <%= hidden_field_tag 'thing[is_accepted]', '1' %>
  <%= f.submit "Accept" %>
<% end %>
<%= form_for @thing do |f| %>
  <%= hidden_field_tag 'thing[is_accepted]', '0' %>
  <%= f.submit "Reject" %>
<% end %>

这对我来说很奇怪,但我似乎找不到任何说这是错误的方法。

我认为,我可以通过使用部分和/或辅助方法来解决问题,但我想确保我走在正确的轨道上而不是做错事。

4 个答案:

答案 0 :(得分:2)

您可以为提交标记命名..即

<%= form_for @thing do |f| %>
  <%= hidden_field_tag 'thing[is_accepted]' %>
  <%= f.submit "Accept", :name => 'accept' %>
  <%= f.submit "Reject", :name => 'reject' %>
<% end %>

然后你可以在params []中检测名称并跳过'1'/'0'值。

答案 1 :(得分:1)

我认为你正确的做法。清理表单的一种方法是使用模型表单帮助程序,所以你最终会得到像

这样的东西。
<%= form_for @thing do |f| %>
  <%= f.hidden_field :accepted, :value => true %>
  <%= f.submit "Accept" %>
<% end %>

<%= form_for @thing do |f| %>
  <%= f.hidden_field :accepted, :value => false %>
  <%= f.submit "Reject" %>
<% end %>

但除此之外,它看起来是正确的方式。我建议不要创建新的方法来执行此操作,因为您没有在正常的Web请求之外做任何事情(在此实例中更新模型)。

使用submit标签作为开关并在params []中检测它也是一种好方法,但我通常更喜欢将控制器保持为vanilla。最后,这两种方式都会在UI中产生相同数量的“东西”,所以你喜欢哪种风格都应该没问题。

答案 2 :(得分:0)

根据您希望UI工作的方式,您可以考虑使用link_to_remote(原型助手的一部分) - 您可以指定一个动作,参数等,并让它返回一些运行的JS。

答案 3 :(得分:-1)

如果你在routes.rb中使用map.resources,你应该能够做到这样的事情:

map.resources :things, :member => {:accept => :get, :reject => :get}

然后在你的控制器中:

def accept
  @thing = Thing.find(params[:id])
  @thing.is_accepted = true
  @thing.save
end

def reject
  @thing = Thing.find(params[:id])
  @thing.is_accepted = false
  @thing.save
end

最后在你看来:

<%= link_to 'Accept', accept_thing_url(@thing) %>
<%= link_to 'Reject', reject_thing_url(@thing) %>

或者如果您使用的是Ajax:

<%= link_to_remote 'Accept', :url => accept_thing_url(@thing) %>
<%= link_to_remote 'Reject', :url => reject_thing_url(@thing) %>