我有两个表:人员和状态,并创建了两个类人和状态。我使用以下代码显示错误消息“仅允许一个状态”。代码不起作用 - 我认为我的If语句中存在一些问题。
<ul>
<% Person.all.each do |person| %>
<li>
<%= person.name %>
<% if status.size >= 1 %>
<em>Only one status is allowed</em>
<% end %>
</li>
<% end %>
</ul>
表人
U_Id Name Place
1 James Florida
2 Mark California
3 Steve Newyork
表状态
Id Status U_Id
1 Hi 1
2 OMG 2
3 Bye 3
4 Help me 2
问题:Mark已发布了U_Id is 2
的2个状态,我想向他显示一条错误消息,例如只允许一个帖子。如何做到这一点?
更新:
人类
class Person < ActiveRecord::Base
validates_presence_of :name
end
答案 0 :(得分:3)
您的编程逻辑错误。您试图对用户可以拥有的状态消息数量施加限制,但似乎您过晚地强制执行该限制,因为您在显示状态时打印错误消息而不是在提交状态时打印错误消息。观看这些消息的人大概是其他用户,他们几乎不关心Mark是否违反了您的设计限制。
您有两种选择。
class User < ActiveRecord::Base
has_one :status
end
这样你就可以:
steve = User.find(3)
steve.status
=> "Bye"
或者,您可以允许无限制状态,但只显示最新状态。
class User < ActiveRecord::Base
has_many :statuses
end
mark = User.find(2)
mark.statuses.last
=> "Help me"
在旁注中......如果用户真正只有一个状态且前者的状态无关紧要,那么您应该考虑删除状态模型并将状态包含在用户模型的字符串属性中。在大多数情况下,这将提高数据库性能。
答案 1 :(得分:0)
user.rb
中我承认你有has_many : statuses
并在status.rb
,belongs_to :user
<ul>
<% Person.all.each do |person| %>
<li>
<%= person.name %>
<% if person.statuses.size >= 1 %>
<em>Only one status is allowed</em>
<% end %>
</li>
<% end %>
</ul>
但是如果您希望person
只有一个status
,为什么不在创建status
时检查这个?或者更好的是,当他试图访问新的状态检查操作时,如果他有状态并将其重定向回来,并显示“您有状态,则只能有一个状态。”
在此之后,您可以轻松使用:
user has_one :status
statuses_controller检查:
def new
if current_user.status.present?
redirect to :back, error: "Only one status for user"
else
@status = current_user.status.new
end
end
并且在执行Person.all.each do |person|
时,您可以直接调用person.status
,它将是db中的第一个且只有一个,而不需要使用if语句。但这取决于我的应用程序应该如何工作。
答案 2 :(得分:0)
我同意Stas。 status.size将不知道“状态”指的是什么。看起来你正试图引用每个人的状态,所以你需要像“person.status.size&gt; = 1”这样的东西。
但是,查看您的Person Class,看起来您可能还没有建立关系。您需要在Person类中包含指定Person has_many:status的代码。首先,请确保User.first.statuses正常工作,然后将相似的代码添加到您的视图中。