在rails中自动为用户创建记录

时间:2015-12-25 04:43:31

标签: ruby-on-rails ruby

我正在处理我的rails应用程序的状态功能。我已经完成了所有设置并且完美无缺。对于界面,我使用best_in_place gem来允许用户根据状态进行编辑。代码如下。

<% if @scoreboard.status.content.present? %>
  <div id="statuscontent">
    <%= render 'statusedit' %>
  </div>
<% else %>
  <%= render 'statusupdate' %>
<% end %>

statusedit部分包含best_in_place代码,statusupdate部分包含用于创建状态的常规表单。下面给出了两个部分的代码。

statusedit

<%= best_in_place [@scoreboard, @status], :content, place_holder: "Enter a status", as: "textarea" %>
<%= link_to "delete", [@scoreboard, @status], method: :delete, data: {confirm: "Are you sure"} %>

statusupdate

<%= form_for [@scoreboard, @status] do |f| %>  
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.text_area :content, class: "form-control", id:"status"  %>
  <%= f.submit "Post", class: "btn btn-primary", id: "status-button" %>  
<% end %>

上面的代码工作得非常好,但是,我正在努力设置我想要的界面。问题是best_in_place编辑仅在以前创建状态时才有效。因此,我必须使用表单创建状态,然后我可以使用就地编辑。但是,我想要界面,以便用户可以使用就地编辑,而无需先物理创建状态。有没有办法为每个用户创建默认状态?或者before_update函数可能会在用户尝试更新之前创建状态。

我尝试使用Ajax创建状态来实现界面,但它并没有按预期工作。此外,我觉得必须有一个更简单的解决方案来解决这个问题。我尝试在数据库中设置:default => "please upload status",但实际上并没有创建默认记录。它就像一个占位符,但你仍然需要点击post来创建记录。有没有办法以某种方式自动为每个用户创建默认状态或在数据库中设置一个值。我已经阅读了一些堆叠溢出的帖子,但没有任何真正指向正确的方向。在rails中必须有一种更简单的方法。任何文档或建议都将是一个很大的帮助。一如既往,任何帮助总是非常感谢!!谢谢 我添加了相关的迁移和模型文件。

status model
    class Status < ActiveRecord::Base
      belongs_to :scoreboard
    end

scoreboard model
    class Scoreboard < ActiveRecord::Base
      has_one :status
    end

Status migration file

class CreateStatuses < ActiveRecord::Migration
  def change
    create_table :statuses do |t|
      t.text :content
      t.references :scoreboard, index: true

      t.timestamps null: false
    end
    add_foreign_key :statuses, :scoreboards
  end
end

3 个答案:

答案 0 :(得分:2)

回答你的问题。

  

有没有办法为每个用户创建默认状态?

您可以在change_column之后在数据库中创建默认记录。

def up
  change_column :users, :admin, :boolean, default: false   # I'm assuming you are saving default as false in users table but you could change accordingly all thing. 
end
  

before_update函数可能会在用户尝试更新之前创建一个状态。

而不是before_update可以使用after_save回调。

As mentioned in official Document

  

after_save在创建和更新时运行,但总是在更多之后运行   无论顺序如何,具体的回调都是after_create和after_update   其中执行了宏调用。

最后

  

在rails

中必须有一种更简单的方法

使用ActiveRecord迁移。

答案 1 :(得分:1)

如果这个答案不具体,请道歉;你写了很多。

您最好在数据库级别为属性设置默认值。

是的,您可以使用before_create回调:

#app/models/scoreboard.rb
class Scoreboard < ActiveRecord::Base
   before_create :set_default_status

   private

   def set_default_status
      self[:status] = "default"
   end
end

这个问题在于它增加了可以由db:

处理的应用程序级逻辑
$ rails g migration CreateStatusDefault

# db/migrate/create_status_default________.rb
class CreateStatusDefault < ActiveRecord::Migration
   def change
      change_column :scoreboards, :status, default: "Default"
   end
end

$ rake db:migrate

在数据库中创建默认值基本上意味着除非您在create / update处从模型中发送值,否则您将获得默认值。

在数据库中设置它的好处在于你的Rails应用程序完全没有工作要做,使它更有效。

-

我后来发现你的status“对象”本身就是一个模型,这可能就是你的问题所在。

如果是这种情况,在创建主/父对象之前,您需要构建关联对象:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :statuses
   before_create -> (model) { model.statuses.build }
end

我们使用此功能为每个注册我们的应用程序的profile构建User;它为您的父模型创建一个“空白”关联记录。

这会给你一个“空白”状态对象,但由于你还没有发布你的代码,我真的不知道。

使用SO的好提示是code&gt; text

如有疑问,请发布代码。

答案 2 :(得分:0)

  

有没有办法为每个用户创建默认状态?

是的你可以自己写。像这样......

User < ActiveRecord::Base
  has_many :statuses
  after_create :create_first_status

  def create_first_status
    self.statuses.create some_status_attribute: "some value"
  end
end