Rails: помощник пути "new or edit"? - PullRequest
8 голосов
/ 11 апреля 2011

Существует ли простой и прямой способ предоставить ссылку в виде, чтобы либо создать ресурс, если он не существует, либо отредактировать существующий, если он существует?

IE:

User has_one :profile

В настоящее время я буду делать что-то вроде ...

-if current_user.profile?
  = link_to 'Edit Profile', edit_profile_path(current_user.profile)
-else
  = link_to 'Create Profile', new_profile_path

Это нормально, если это единственный способ, но я пытался увидеть, есть ли "Rails Way", чтобы сделать что-токак:

= link_to 'Manage Profile', new_or_edit_path(current_user.profile)

Есть ли какой-нибудь хороший чистый способ сделать что-то подобное?Нечто подобное представлению, эквивалентному Model.find_or_create_by_attribute(....)

Ответы [ 5 ]

26 голосов
/ 11 апреля 2011

Напишите помощника для инкапсуляции более сложной части логики, тогда ваши представления могут быть чистыми.

# profile_helper.rb
module ProfileHelper

  def new_or_edit_profile_path(profile)
    profile ? edit_profile_path(profile) : new_profile_path(profile)
  end

end

Теперь в ваших представлениях:

link_to 'Manage Profile', new_or_edit_profile_path(current_user.profile)
7 голосов
/ 06 октября 2011

Я сталкивался с такой же проблемой, но у меня было много моделей, для которых я хотел сделать это. Казалось утомительным писать нового помощника для каждого, поэтому я придумал следующее:

def new_or_edit_path(model_type)
  if @parent.send(model_type)
    send("edit_#{model_type.to_s}_path", @parent.send(model_type))
  else
    send("new_#{model_type.to_s}_path", :parent_id => @parent.id)
  end
end

Тогда вы можете просто позвонить new_or_edit_path :child для любого потомка родительской модели.

5 голосов
/ 11 апреля 2011

Другой способ!

  <%=
     link_to_if(current_user.profile?, "Edit Profile",edit_profile_path(current_user.profile)) do
       link_to('Create Profile', new_profile_path)
     end
  %>
1 голос
/ 13 февраля 2017

Если вам нужен общий способ:

def new_or_edit_path(model)
  model.new_record? ? send("new_#{model.model_name.singular}_path", model) : send("edit_#{model.model_name.singular}_path", model)
end

Где model - это переменная вашего экземпляра в вашем представлении.Пример:

# new.html.erb from users
<%= link_to new_or_edit_path(@user) do %>Clear Form<% end %>
0 голосов
/ 28 июля 2014

Попробуйте это:

module ProfilesHelper

  def new_or_edit_profile_path(profile)
    profile ? edit_profile_path(profile) : new_profile_path(profile)
  end

end

и с вашей ссылкой, как:

<%= link_to 'Manage Profile', new_or_edit_profile_path(@user.profile) %>
...