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

时间:2016-01-14 08:48:21

标签: ruby-on-rails

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

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

1 个答案:

答案 0 :(得分:5)

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

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

-

  

当用户登录时,应显示订单表单

这是user story

当你处理应用程序开发时,你应该围绕一个"故事"用户如何到达那里,他们应该获得什么?它应该如何运作。许多人会将此称为" context"。

您尚未解决的一个重要问题是为什么向用户显示订单表单 - 它的用途是什么?

要直接回答您的问题,请查看authentication

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

滑轨'最佳身份验证系统是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

这将为您提供一个起点,您可以在其中创建controllersviews

-

由于Rails设计为object orientated,因此您所做的一切都应以您正在处理的对象为中心。

因此,您需要单独处理usersorders(创建用户时的IE,他们会立即转到orders#new操作):

#config/routes.rb
devise_for :users #-> url.com/users/sign_in
resources :orders #-> url.com/orders/new

以上是resourceful routing,我们会让你知道那是什么。

您需要的是以下内容:

#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

这会在用户登录后将其重定向到orders/new操作。如果用户未经过身份验证即可访问该操作,他们将被带到&#34;登录/注册&#34;路径。