10

是否有一种简单直接的方法可以在视图中提供链接,以便在资源不存在时创建资源,或者在存在资源时编辑现有资源?

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(....)

4

5 回答 5

30

编写一个助手来封装逻辑中更复杂的部分,然后你的视图就可以干净了。

# 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)
于 2011-04-11T18:01:06.020 回答
7

我遇到了同样的问题,但有很多我想为它做的模型。必须为每个人编写一个新的助手似乎很乏味,所以我想出了这个:

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父模型的任何孩子。

于 2011-10-06T15:47:47.557 回答
5

其他方式!

  <%=
     link_to_if(current_user.profile?, "Edit Profile",edit_profile_path(current_user.profile)) do
       link_to('Create Profile', new_profile_path)
     end
  %>
于 2011-04-11T18:38:11.007 回答
1

如果你想要一个通用的方式:

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 %>
于 2017-02-13T11:39:12.323 回答
-4

试试这个:

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) %>
于 2014-07-28T12:34:18.143 回答