我有一个refinerycms应用程序,其上安装了社区博客引擎。我想在blog_post中添加一个图像字段,以便我可以为帖子选择一个主图像并将其显示在我的视图中。
我尝试添加图片字段,没有快乐。然后我查看了一个带有图像字段的其他自定义引擎,并使用image_id链接到主图像表,所以我尝试添加一个image_id字段,并编辑blog_post模型以具有相同的'belongs_to'行。编辑博客加载的页面,图像选择器部分工作,但当我点击保存时,看起来没有任何东西被发送到我的表。
我担心的一件事是,当我使用图像字段创建自定义引擎时,我将其指定为字段类型图像。这似乎在后端创建了image_id字段,并设置了所有内容,因此我仍然可以引用图像类。向博客添加图像字段并没有这样做,只是创建了一个名为image的字段类型。在检查我的自定义引擎的表时,没有名为image的字段类型,因此某处有一些我无法重新创建的转换魔法。
目前我有以下代码:
创建此迁移:
class AddPictureToBlog < ActiveRecord::Migration
def self.up
add_column :blog_posts, :main_image_id, :integer
end
def self.down
remove_column :blog_posts, :main_image_id
end
end
将此添加到blog_post模型:
belongs_to :main_image_id, :class_name => 'Image'
并在视图中显示:
<%= f.label :main_image_id -%>
<%= render :partial => "/shared/admin/image_picker", :locals => {
:f => f,
:field => :main_image_id,
:image => @blog_post.main_image_id,
:toggle_image_display => false
} %>
自定义引擎甚至没有引用_id字段,所以我不知道这里缺少哪些链接。任何帮助将不胜感激。它可能根本不是一个refinerycms特定的问题 - 我是rails的新手,所以这里可能缺少一些基础知识。
谢谢!
答案 0 :(得分:14)
对于rails 3.2.3和refinerycms 2.0.0,bleow代码可以正常工作,
创建新迁移:
rails generate migration add_image_id_to_refinery_blog_posts image_id:integer
rake db:migrate
在“decorators / refinery / blog /”下创建一个文件post_decorator.rb
添加以下行
Refinery::Blog::Post.class_eval do
# Whitelist the :image_id parameter for form submission
attr_accessible :image_id
belongs_to :image
end
生成炼油厂表单文件:
rake refinery:override view=refinery/blog/admin/posts/_form
并在“views / refinery / blog / admin / posts / _form.html.erb”中添加以下代码
<div class="field">
<%= f.label :image_id %>
<%= render :partial => "/refinery/admin/image_picker", :locals => {
:f => f,
:field => :image_id,
:image => f.object.image,
:toggle_image_display => false
}
%>
</div>
有关详细信息,请参阅链接extending-models
答案 1 :(得分:7)
这就是我最终做到的方式(但我已将功能请求放入;)):
创建新迁移:
rails generate migration add_image_id_to_blog_posts image_id:integer
rake db:migrate
将此添加到 blog_post.rb模型:
attr_accessible :image_id
belongs_to :image
修改博客管理表单视图以包含以下内容:
<div class='field'>
<%= f.label :image -%>
<%= render :partial => "/shared/admin/image_picker", :locals => {
:f => f,
:field => :image_id,
:image => f.object.image,
:toggle_image_display => false
} %>
</div>
你应该好好去吧! :)
答案 2 :(得分:3)
您是否考虑过使用页面图像?
答案 3 :(得分:1)
我将更新rails 4.x和Refinery 3.x的答案
创建新的迁移,将新的image_id字段添加到refinery_blog_posts模型:
rails generate migration add_image_id_to_refinery_blog_posts image_id:integer
然后运行迁移:
rake db:migrate
现在,您需要在 decorators / refinery / blog / 目录下使用以下名称 post_decorator.rb 创建一个文件,然后在其中编写此代码:
Refinery::Blog::Post.class_eval do
belongs_to :image, :class_name => '::Refinery::Image'
end
当装饰器完成后,你需要将新的image_id字段添加到controllers / refinery / blog / admin / posts_controller.rb到允许的参数,如下所示:
def post_params
params.require(:post).permit(:title, :body, :custom_teaser, :image_id, :tag_list, :draft, :published_at, :custom_url, :user_id, :browser_title, :meta_description, :source_url, :source_url_title, :category_ids => [])
end
在上面之后,唯一保留它的是将新的image_id字段添加到表单中,以便能够在这种情况下将图像添加到帖子中:
<div class="field">
<%= f.label :image_id, "Post Image" %>
<%= render :partial => "/refinery/admin/image_picker", :locals => {
:f => f,
:field => :image_id,
:image => f.object.image,
:toggle_image_display => false
}
%>
</div>
现在你已经完成了,按照这个步骤,你可以将任何类型的字段添加到炼油厂模型,例如本案例中的帖子。
希望有所帮助:)