我正在开发一个自学Rails应用程序(可以找到源代码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;”
如果您需要任何其他信息,请告诉我,我会尽快提供。
谢谢。
答案 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。他们有很多令人满意的内容。