在发布文本或图像之前进行验证

时间:2013-12-03 13:40:59

标签: ruby-on-rails ruby-on-rails-3

我正在开发一个自学Rails应用程序(可以找到源代码here。我想在发布文本或图像之前验证内容的存在:

here

这些是我的models或下面的内容:

class Post < ActiveRecord::Base
  belongs_to :user
  default_scope { order ("created_at DESC")}
  belongs_to :content, polymorphic: true
  has_reputation :votes, source: :user, aggregated_by: :sum
end

class PhotoPost < ActiveRecord::Base
  has_attached_file :image, styles: {
    post: "200x200>"
  }
end

class TextPost < ActiveRecord::Base
  attr_accessible :body
end

以下是我的controllers,以防他们与此有关系。可以在我的Github帐户中找到任何其他文件。我确信复制整个项目会很麻烦(这就是我为控制器和我的项目提供链接的原因)。

所以我到目前为止所尝试过的。 (我试过帖子模型上的那些)

=&GT;使用validates_associated

validates_associated :content, :text_post

并为#Post获取错误“undefined method`text_post':0x517c848&gt;”

=&GT;使用验证

   validates :content, :presence => true

并且没有错误,但是创建的帖子没有文字。

validates :body, :presence => true

并为#Post获取错误“undefined method`body':0x513e4a8&gt;”

如果您需要任何其他信息,请告诉我,我会尽快提供。

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来你有一个令人困惑的模型设置与一些关键缺失的关系规则。例如。未使用的多态规则和用户与Post之间的has_many关系,Post模型中没有user_id值的符号a。我将如何设置它:

<强> User.rb

def User << ActiveRecord::Base
   has_many :text_posts
   has_many :photo_posts
end 

<强> TextPost.rb

def TextPost << ActiveRecord::Base
   attr_accessible :body, :user_id
   belongs_to :user
   validates :body, :presence => true
end

<强> PhotoPost.rb

def PhotoPost << ActiveRecord::Base
   attr_accessible :image, :user_id
   belongs_to :user
   validates :file, :presence => true, :format => {
      :with => %r{\.(gif|png|jpg)$}i,
      :message => "must be a URL for GIF, JPG or PNG image."
   }
end

然后在你看来你需要这样做:

<%= form_for @text_post do |f| %>
# ...
<% end %>

在您的控制器中,您可以修改create方法以包含来自devise的current_user并将其分配给新的文本发布记录(user_id属性):

<强> text_posts_controller.rb

def create 
   @text_post = current_user.text_posts.new(params[:text_post])
end

这更符合Ruby on Rails所擅长的DRY原则 - 您不应该编写很多代码来创建新记录。

我建议阅读一些Ruby on Rails标准和最佳实践。您不需要在仪表板模型中创建方法以创建新的TextPost或PhotoPost记录。这是一种非常混乱的方式;相反,你应该利用ActiveRecord关系的力量。

我建议您查看Railscasts。他们有很多令人满意的内容。