在创建铁轨新帖子时,如何保存图像模型



我正在尝试制作像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宝石似乎是最受欢迎的

最新更新