首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多模型逻辑的Rails 7多步形式

具有多模型逻辑的Rails 7多步形式
EN

Stack Overflow用户
提问于 2022-11-28 00:35:42
回答 1查看 42关注 0票数 0

目前,我正在努力构建一个多步骤表单,其中每个步骤都创建一个模型实例。

在这种情况下,我有三个模型:

  1. UserPlan
  2. Connection
  3. GameDashboard

既然协会是这样的:

useruser_plan A connection属于user_plan game_dashboard属于connection

我想创建一个向导,允许current_user创建一个经过多步表单的game_dashboard,其中他还创建了连接和user_plan实例。

为此,我查看了Wicked,并开始从game_dashboard (这是最后一个)创建逻辑。当我不得不面对形式生成的时候,我觉得也许从底部开始并不是更好的解决方案。

所以我才来寻求帮助:

实现这个向导的更好方法是什么?从底部开始(game_dashboard)还是从顶部开始(use_plan)?

由于我目前没有向代码求助,所以我没有编写任何控制器或模型的逻辑,以防它对某人有帮助,我会把它放进去!

非常感谢

编辑

由于我需要一次只允许一个进程,但允许多个进程,为了避免params值,我决定创建一个名为“入职”的新模型,在那里处理步骤状态,每次检查步骤。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-28 01:38:50

最简单的方法是依赖Rails的标准MVC模式。

只需使用createupdate控制器方法链接到下一个模型的表单(而不是showindex视图)

例如。

代码语言:javascript
复制
class UserPlansController < ApplicationController
  ...

  def create
    if @user_plan = UserPlan.create(user_plan_params)
      # the next step in the form wizard process:
      redirect_to new_connection_path(user_id: current_user, user_plan_id: @user_plan.reload.id)
    else
      @user_plan = UserPlan.new(user: current_user)
      render :new
    end    
  end

  ...

  # something similar for #update action
end

对于路线,您有两种选择:

你什么都可以筑巢:

代码语言:javascript
复制
# routes.rb

resources :user do
  resources :user_plan do
    resources :connection do
      resources : game_dashboard
    end
  end
end

专业:

这将使控制器中的关联设置更容易,因为您的所有路由都将满足您的需要。例如:

/users/:user_id/user_plans/:user_plan_id/connections/:connection_id/game_dashboards/:game_dashboard_id

Con:

您的路线和链接帮助将是非常长和紧张的“底部”。例如。

game_dashboard_connection_user_plan_user_path(:user_id, :user_plan_id, :connection_id, :game_dashboard)

您只需手动将向导“步骤”链接到一起即可。

专业:

网址和帮手没那么疯狂。例如。

new_connection_path(user_plan_id: @user_plan.id)

使用一个有意义的URL变量:user_plan_id=1,您可以在上游查找所有内容。例如:

代码语言:javascript
复制
@user_plan = UserPlan.find(params['user_plan_id'])
@user = @user_plan.user

Con:

(不是什么“骗局”,因为你可能最终还是会这么做的)

如果需要显示有关“父”记录的信息,则必须首先在控制器中执行模型查找:

代码语言:javascript
复制
class GameDashboardController < ApplicationController
  # e.g. URL: /game_dashboards/new?connection_id=1
  def new
    @connection = Connection.find(params['connection_id'])
    @user_plan = @connection.user_plan
    @user = @user_plan.user
    @game_dashboard = GameDashboard.new(connection: @connection)
  end
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74594888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档