在新操作中创建新记录是不好的做法吗?

时间:2015-09-23 04:28:51

标签: ruby-on-rails ruby-on-rails-4

如果出于某种原因,我不要求用户将数据输入到表单中以在我的rails应用程序中创建新记录,而只是这样做:

def new
  @blahblah = Blahblah.create({
    x: "blah",
    y: "blah"
  })
  redirect_to action:'index'
end

在这样的新动作中创建新记录会被视为不良做法吗?我发现自己经常遇到需要将数据保存到数据库但不需要通过表单从用户那里获取数据的情况(发送到创建操作,我通常会创建'记录)。

3 个答案:

答案 0 :(得分:2)

我认为你不应该让Restful脏。你不应该触摸新的或创建动作。你应该在控制器中进行另一个动作并做任何你想做的事。

这不是在新操作中添加创建代码的正确方法。所以要么直接创建动作,要么我的首选去做另一个动作并将你的代码放在那里。

您可以创建另一个操作而不是新操作。所以你的新动作不会受到影响。

##routes.tb
get 'whatever/create_record' => 'whatever#create_record', :as => 'create_record'

并在您的控制器中

##whatever_conroller.rb
redirect_to create_record_path(:attr1 => val1 ...)

这将正确地采用create_record方法。而你的新动作不会受到影响。因为new/create/update/edit/destroy专门设计用于休息路由。

答案 1 :(得分:0)

您可以使用create操作。另一方面,如果您管理自定义业务逻辑,则可以在控制器中使用自定义操作(不要忘记使用新操作更新routes.rb

答案 2 :(得分:0)

  

是否会被视为不良行为

Rails的整个精神是CRUD based infrastructure

  

网络的缩写词在哪里? REST代表   REpresentational State Transfer并描述资源(在我们的案例中)   URL)我们可以在其上执行操作。 CRUD,代表Create,   读取,更新,删除,是我们执行的操作。

     

虽然,在   Rails,REST和CRUD是最好的伙伴,两者可以很好地工作   他们自己的。事实上,每次你编写一个后端系统   允许您添加,编辑和删除数据库中的项目,以及   前端,允许您查看这些项目,你一直在工作   与CRUD。

-

这一切基本上意味着当您拥有controllersmodelsroutes时,您正在使用objects

你的问题:

def new
  @blahblah = Blahblah.create({
    x: "blah",
    y: "blah"
  })
  redirect_to action:'index'
end

打破了CRUD的Rails约定。如果你想创建一个没有任何输入的对象,你为什么不硬编码,或者手动seed it into the database

#app/models/blahblah.rb
class Blahblah < ActiveRecord::Base
   def self.x
      # value
   end
   def self.y
     # value
   end
end

这将允许您致电:

@geolocation = Geomap.x * Geomap.y
  

我需要将数据保存到数据库但不需要获取数据   来自用户的数据

您需要保存哪些数据?

如果有类似role信息的内容,请将其包含在User创建过程中,callbacks包括before_create

#app/models/user.rb
class User < ActiveRecord::Base
   before_create :set_role

   def set_role 
      role_id = "0" unless self.role
   end
end