Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RAILS中创建新帖子时保存图像图像模型_Ruby On Rails - Fatal编程技术网

Ruby on rails 如何在RAILS中创建新帖子时保存图像图像模型

Ruby 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: [:

我正在尝试在rails中创建一个类似博客的应用程序。我希望我的每封邮件都有多个图像,所以我为Letters和imagesone-to-many关系制作了两个单独的表格。有人能告诉我如何保存图像与适当的字母_的id的时候,创造新的职位

另外,我对rails非常陌生,请详细解释。非常感谢你的帮助

字母_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' %>
<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文件中正确显示图像??