我正在尝试制作像Rails中的应用程序这样的博客。我希望我的每个帖子(字母)都有多个图像,因此我为字母和图像制作了两个单独的表格(一对一对多关系)。有人可以告诉我如何在创建新帖子时使用适当的Letter_ID保存图像。
P.S。我是Rails的新手,请以精致的方式解释。非常感谢帮助。
letters_controller.rb
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' %>
_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
<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
属性,您将图像路径保存到中。这是一种方法:
a)添加一个调用以接受嵌套属性:
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
这将允许您提交表格并将其转到PostsController#create
时,它将创建带有图像的帖子。
我看不到您的模型,但我确实注意到您的表格正在提交实际文件,因此您需要以html参数的形式发送 multipart: true
。对如何在Rails中发送多部分形式进行一些研究,您会发现它(但这与此问题有点无关)。
然后,确保您具有良好的上传/图像处理。PaperClip Rmagick宝石似乎是最受欢迎的