我想在重定向到用户配置文件后在图片上方显示图片标题。我上传了一张带有标题的图片,但它只显示带有标签和用户的图片。我尝试在下面的show.html.haml中添加代码,但标题根本不显示。我做错了什么?
图片_控制器.rb
class PhotosController < ApplicationController
def create
@user = User.find(params[:user_id])
if params[:photo][:title] == ""
flash[:alert] = "Please enter an image title"
redirect_to :back
elsif params[:photo][:image] == nil
flash[:alert] = "Please upload a photo"
redirect_to :back
else
@photo = Photo.create(photo_params)
@photo.user_id = @user.id
@photo.save
flash[:notice] = "Successfully uploaded a photo"
redirect_to user_path(@user)
end
end
def new
@user = User.find(params[:user_id])
@photo = Photo.create()
end
private
def photo_params
params.require(:photo).permit(:image, :title)
end
end
photo.rb
class Photo<ActiveRecord::Base
belongs_to :user
has_many :tags
has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
validates :title, :presence => true
end
20150318211456_照片_表格. rb
class PhotosTable < ActiveRecord::Migration
def change
create_table :photos do |photons|
photons.column :user_id, :integer
photons.column :title, :string
photons.timestamps
end
end
end
new.html.haml
%h1 Add a Photo
= form_for Photo.new(), :url => user_photos_path, :html => {:multipart => true} do |form|
= form.label :title
= form.text_field :title
%br
%br
= form.file_field :image
%br
%br
%br
= form.submit 'Upload', class: "btn btn-primary btn-lg"
show.html.haml
= link_to @user_photos_path do
= @photo.title
= image_tag @photo.image.url
= image_tag @photo.image.url(:thumb)
2条答案
按热度按时间h43kikqp1#
您可以为
:caption
添加一个字段,就像对:image
所做的那样:new.html.erb
show.html.erb
q1qsirdb2#
您的尝试很有创意,但实际上与如何在Rails中执行CRUD没有任何关系:
第一个
您混淆了用于初始化内存中新示例的
Photo.new
方法和将记录保存到数据库中的Photo.create
方法-您不希望在控制器的new
方法中执行此操作。if params[:photo] == nil
是无意义的。params.require(:photo)
将引发ActionController::ParameterMissing
异常是参数不存在。如果你想确保用户上传了照片或标题存在,你use validations in your model。您没有检查的是一件实际上很重要的事情-记录实际上是有效的,并保存在DB中。
使用
form_with
而不是旧的form_for
,后者将最终被取消,并将表单绑定到您在控制器中创建的模型示例:这样,当表单提交无效时,表单将保留用户输入。这就是为什么调用
render :new
而不是redirect_to :back
的原因。如果客户端不发送HTTP_REFERRER头(换句话说,不使用它),后者实际上也不起作用。