我正在处理我的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
答案 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