Несколько ссылок в Rails показывают, что каждая выполняет разные действия - как лучше всего справиться с этим? - PullRequest
1 голос
/ 08 января 2009

Одна из вещей, которые я делаю, включает несколько ссылок в представлении show . Например, у меня есть ссылка (или кнопка) для «Принятие», и еще одна для «Отклонение». Нажмите Принять, и модель обновит поле is_accepted как true, нажмите Отклонить, а поле is_accepted - false.

Теперь, как мне лучше всего справиться с этим? В ASP.NET я просто создал бы LinkButton и написал бы обработчик, но Rails так не работает, поэтому я пытаюсь выяснить, как по существу копировать то, что будет делать LinkButton.

Прямо сейчас я кодирую две формы в одном и том же виде, почти идентичные, которые выглядят так:

<%= 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 ]

2 голосов
/ 09 января 2009

Вы можете дать вашему тегу отправки имя .. т.е.

<%= 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 голос
/ 09 января 2009

Я думаю, вы делаете это правильно. Один из способов очистки ваших форм - это использование помощников моделей на всех этапах, так что вы получите что-то вроде

<%= 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 %>

Но кроме этого, похоже, что это правильный путь. Я бы посоветовал не создавать новые методы для этого, потому что вы ничего не делаете, кроме обычных веб-запросов (обновление модели в этом случае).

Использование тега submit в качестве переключателя и его обнаружение в параметрах [] также является хорошим способом, но я обычно предпочитаю держать мои контроллеры как можно более ванильными. В конце концов, оба эти способа в конечном итоге приводят к одинаковому количеству «материала» в пользовательском интерфейсе, поэтому любой стиль, который вы предпочитаете использовать, должен подойти.

0 голосов
/ 09 января 2009

Если вы используете map.resources в вашем route.rb, вы сможете сделать что-то вроде этого:

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) %>
0 голосов
/ 09 января 2009

В зависимости от того, как вы хотите, чтобы ваш пользовательский интерфейс работал, вы можете рассмотреть link_to_remote (часть помощника по прототипу) - вы можете указать действие, параметры и т. Д. И заставить его возвращать JS, который запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...