我应该如何在Ruby on Rails中使用IF语句

时间:2013-07-13 09:53:16

标签: ruby-on-rails

我有两个表:人员和状态,并创建了两个类状态。我使用以下代码显示错误消息“仅允许一个状态”。代码不起作用 - 我认为我的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

3 个答案:

答案 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.rbbelongs_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正常工作,然后将相似的代码添加到您的视图中。