Ruby on rails 如何在RAILS中创建新帖子时保存图像图像模型
我正在尝试在rails中创建一个类似博客的应用程序。我希望我的每封邮件都有多个图像,所以我为Letters和imagesone-to-many关系制作了两个单独的表格。有人能告诉我如何保存图像与适当的字母_的id的时候,创造新的职位 另外,我对rails非常陌生,请详细解释。非常感谢你的帮助 字母_controller.rbRuby on rails 如何在RAILS中创建新帖子时保存图像图像模型,ruby-on-rails,Ruby On Rails,我正在尝试在rails中创建一个类似博客的应用程序。我希望我的每封邮件都有多个图像,所以我为Letters和imagesone-to-many关系制作了两个单独的表格。有人能告诉我如何保存图像与适当的字母_的id的时候,创造新的职位 另外,我对rails非常陌生,请详细解释。非常感谢你的帮助 字母_controller.rb class LettersController < ApplicationController before_action :set_letter, only: [:
class LettersController < ApplicationController
before_action :set_letter, only: [:edit, :update, :show, :destroy]
before_action :require_same_user, only: [:edit, :update, :destroy]
def index
@letters = Letter.all
end
def new
@letter = Letter.new
end
def create
@letter = Letter.new(letter_params)
@letter.user = current_user
if @letter.save
flash[:success] = 'Letter submitted successfully...'
redirect_to letter_path(@letter)
else
render 'new'
end
end
def edit
end
def update
if @letter.update(letter_params)
flash[:success] = 'Letter updated successfully...'
redirect_to letter_path(@letter)
else
render 'edit'
end
end
def show
# @letter_images = Image.find("letter_id = ?", params[:id])
end
def destroy
@letter.destroy
flash[:success] = 'Letter removed successfully...'
redirect_to root_path
end
private
def set_letter
@letter = Letter.find(params[:id])
end
def letter_params
params.require(:letter).permit(:title, :description, images_attributes:
[:picture])
end
def require_same_user
if current_user != @letter.user and !current_user.admin?
flash[:danger] = 'you can only edit your own letters'
redirect_to root_path
end
end
end
new.html.erb
<h1 align="center">Create a Letter</h1>
<%= render 'form' %>
<h2 align="center">Title: <%= @letter.title %></h2>
<div class="well col-xs-8 col-xs-offset-2">
<% if @letter.user %>
<ul class="listing" style= "list-style:none;">
<div class="row center">
<div class="col-md-4 col-md-offset-4">
<li>Created by:</li>
<li class="letter-title">
<%= link_to @letter.user.name, user_path(@letter.user) %>
</li>
<li><small>
<%= pluralize(@letter.user.letters.count, "letter") if @letter.user.letters %>
</small></li>
</div>
</div>
</ul>
<% end %>
<% if @letter.images %>
<%= image_tag(@letter.images, size: "300x300") %>
<% end %>
<h4 class="center description"><strong>Description:</strong></h4>
<hr>
<%= simple_format(@letter.description) %>
<div class="letter-actions">
<% if logged_in? && (current_user == @letter.user || current_user.admin?) %>
<%= link_to "Edit this letter", edit_letter_path(@letter), class: "btn btn-xs btn-primary" %>
<%= link_to "Delete this letter", letter_path(@letter), method: :delete,
data: { confirm: "Are you sure you want to delete the letter?"},
class: "btn btn-xs btn-danger" %>
<% end %>
<%= link_to "View all letters", letters_path, class: "btn btn-xs btn-success" %>
</div>
</div>
_form.html.erb
<%= render 'shared/errors', obj: @letter %>
<div class='row'>
<div class='col-xs-12'>
<%= form_for(@letter, :html => {class: "form-horizontal", role: "form"}) do |f| %>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :title %>
</div>
<div class="col-sm-8">
<%= f.text_field :title, class: "form-control", placeholder: "Title of letter", autofocus: true %>
</div>
</div>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :description %>
</div>
<div class="col-sm-8">
<%= f.text_area :description, rows: 10, class: "form-control", placeholder: "Body of letter" %>
</div>
</div>
<div class="form-group">
<div class="control-label col-sm-2">
<%= f.label :picture %>
</div>
<div class="col-sm-8">
<%= f.file_field :picture, accept: 'image/jpeg, image/gif, image/png, image/jpg', class: "form-control", placeholder: "Upload an Image" %>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<%= f.submit class: 'btn btn-primary btn-lg' %>
</div>
</div>
<% end %>
<div class="col-xs-4 col-xs-offset-4">
[ <%= link_to "Cancel request and return to letters listing", letters_path %> ]
</div>
</div>
</div>
show.html.erb
<h1 align="center">Create a Letter</h1>
<%= render 'form' %>
<h2 align="center">Title: <%= @letter.title %></h2>
<div class="well col-xs-8 col-xs-offset-2">
<% if @letter.user %>
<ul class="listing" style= "list-style:none;">
<div class="row center">
<div class="col-md-4 col-md-offset-4">
<li>Created by:</li>
<li class="letter-title">
<%= link_to @letter.user.name, user_path(@letter.user) %>
</li>
<li><small>
<%= pluralize(@letter.user.letters.count, "letter") if @letter.user.letters %>
</small></li>
</div>
</div>
</ul>
<% end %>
<% if @letter.images %>
<%= image_tag(@letter.images, size: "300x300") %>
<% end %>
<h4 class="center description"><strong>Description:</strong></h4>
<hr>
<%= simple_format(@letter.description) %>
<div class="letter-actions">
<% if logged_in? && (current_user == @letter.user || current_user.admin?) %>
<%= link_to "Edit this letter", edit_letter_path(@letter), class: "btn btn-xs btn-primary" %>
<%= link_to "Delete this letter", letter_path(@letter), method: :delete,
data: { confirm: "Are you sure you want to delete the letter?"},
class: "btn btn-xs btn-danger" %>
<% end %>
<%= link_to "View all letters", letters_path, class: "btn btn-xs btn-success" %>
</div>
</div>
假设您的模型如下所示:
class Post
has_many :images
end
class Image
belongs_to :post
end
另外,假设您的帖子模型有一个title属性,而您的图像模型有一个url属性,您要将图像路径保存到其中。以下是一种方法:
添加一个接受嵌套属性的调用:
class Post
has_many :images
accepts_nested_attributes_for :images
end
b更改控制器以允许图像上的属性:
class PostsController
... actions code ...
def post_params
params.require(:post).permit(:title, images_attributes: [:url])
end
end
c最后,是时候改变你的表格了:
= form_for @post do |f|
%h2 Post
%p
= f.label :title
= f.text :title
%h2 Images
= f.fields_for :images do |fi|
%p
= fi.label :url
= fi.text :url
= f.submit
这将允许,当您提交表单并转到PostsControllercreate时,它将创建包含图像的帖子
我看不到您的模型,但我注意到您的表单正在提交实际文件,因此您需要在表单html参数中发送multipart:true。研究一下如何在Rails中发送多部分表单,您会发现这一点,但这与这个问题有点无关
然后,确保你有一个良好的上传/图像处理gems似乎是最受欢迎的分享您的帖子\u控制器、图片\u控制器、路线代码?请展示您的问题。您应该至少包括一个大纲,但最好是一个有问题的代码的大纲,然后我们可以尝试帮助解决具体问题。你也应该阅读。任何解决方案都取决于你迄今为止设置的代码,因此你可以共享你的代码,至少是图像上载表单,然后可能是其他人询问的控制器。很抱歉没有共享代码。我现在就更新。我试过你说的,但似乎不起作用。通过查看代码,您能提出其他建议吗?“是的,现在看。”PulkitGoel我在回答中添加了几句话,希望它们能为您提供更好的解决方法。是的,先生,我正在使用carrierwave处理上传。我做了一个多部分的表格。但它仍然显示出同样的错误。我是否在show.html.erb文件中正确显示图像??