Rails:“新建或编辑”路径助手?

发布于 2024-11-01 06:21:28 字数 555 浏览 4 评论 0原文

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

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(....) 的视图

Is there a simple and straightforward way to provide a link in a view to either create a resource if it doesn't exist or edit the existing on if it does?

IE:

User has_one :profile

Currently I would be doing something like...

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

This is ok if it's the only way, but I've been trying to see if there's a "Rails Way" to do something like:

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

Is there any nice clean way to do something like that? Something like the view equivalent of Model.find_or_create_by_attribute(....)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

撩动你心 2024-11-08 06:21:28

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

# 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)

Write a helper to encapsulate the more complex part of the logic, then your views can be clean.

# profile_helper.rb
module ProfileHelper

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

end

Now in your views:

link_to 'Manage Profile', new_or_edit_profile_path(current_user.profile)
寂寞清仓 2024-11-08 06:21:28

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

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

I came across this same problem, but had a lot of models I wanted to do it for. It seemed tedious to have to write a new helper for each one so I came up with this:

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

Then you can just call new_or_edit_path :child for any child of the parent model.

哀由 2024-11-08 06:21:28

另一种方式!

  <%=
     link_to_if(current_user.profile?, "Edit Profile",edit_profile_path(current_user.profile)) do
       link_to('Create Profile', new_profile_path)
     end
  %>

Another way!

  <%=
     link_to_if(current_user.profile?, "Edit Profile",edit_profile_path(current_user.profile)) do
       link_to('Create Profile', new_profile_path)
     end
  %>
帝王念 2024-11-08 06:21:28

如果您想要一种通用方法:

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

If you want a generic way:

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

Where model is your instance variable on your view. Example:

# new.html.erb from users
<%= link_to new_or_edit_path(@user) do %>Clear Form<% end %>
神妖 2024-11-08 06:21:28

试试这个:

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

Try this:

module ProfilesHelper

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

end

and with your link like:

<%= link_to 'Manage Profile', new_or_edit_profile_path(@user.profile) %>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文