两种型号,两种形式在轨道上的红宝石

poo*_*vai 0 ruby-on-rails

我试图在一个控制器中创建两个模型.我想创建一个用户注册的新页面.当用户登录时,应显示订单表格.我应该在哪个页面中创建此订单表单?

当用户点击新页面中的提交按钮时,将调用create方法..现在,当我单击订单中的提交按钮时,我需要相同的操作..我应该在哪里创建此表单?可以在新页面中显示多个表单吗?任何人都可以建议我..

Ric*_*eck 5

既然你是新人,我会解释它是如何运作的.

这不是严格要求回答SO问题的方式,但既然你是新的,我会写的.如果你想删除Q或其他什么,我不介意.

-

用户登录时,应显示订单

这是一个用户故事.

当你处理应用程序开发时,你应该围绕用户如何到达那里,他们应该获得什么以及它应该如何工作的"故事".许多人将此称为"背景".

您没有解决的一个重要问题是为什么要向用户显示订单 - 这是为了什么?


要直接回答您的问题,您需要查看身份验证.

验证基本上是用户是否登录/注册.不要与授权混淆,授权是指用户是否有权执行操作.

Rails的最佳身份验证系统是Devise.您可以在此处查看有关如何使用它的教程:http://railscasts.com/episodes/209-introducing-devise

您需要两个模型,您必须单独处理:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :orders
end

#app/models/order.rb
class Order < ActiveRecord::Base
   belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个起点,您将能够创建您的controllersviews.

-

因为Rails被设计为面向对象,所以你所做的一切都应该以你正在处理的对象为中心.

因此,你需要处理usersorders单独(IE浏览器创建用户时,他们立即去orders#new行动):

#config/routes.rb
devise_for :users #-> url.com/users/sign_in
resources :orders #-> url.com/orders/new
Run Code Online (Sandbox Code Playgroud)

以上是资源丰富的路由,我会告诉你这是什么.

您需要的是以下内容:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
      resource.orders.count > 0 ? new_order_path : root_path
  end
end

#app/controllers/orders_controller.rb
class OrdersController < ApplicationController
   before_action :authenticate_user!

   def new
      @order = current_user.orders.new
   end

   def create
      @order = current_user.orders.new order_params
      @order.save
   end

   private

   def order_params
      params.require(:order).permit(:x, :y, :z)
   end
end
Run Code Online (Sandbox Code Playgroud)

这将在用户orders/new登录后将用户重定向到该操作.如果他们在未经过身份验证的情况下访问该操作,他们将被带到"登录/注册"路径.