如何在控制器中验证失败时记住 active_storage 文件名
How to remember active_storage file name when validation fails in controller
在 rails 5.2.3
应用程序中,我有一个模型 Post
,它使用 active_storage 来附加文件并具有 duration
和 place
的字段. duration
必须存在。
class Post
has_one_attached :video
validates :duration, presence: true
end
使用simple_form
表单中的字段声明为
<%= f.input :duration %>
<%= f.input :place %>
<%= f.input :video %>
控制器具有以下创建逻辑
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = 'Post has been saved'
redirect_to root_path
else
@title = 'New Post'
@user = current_user
render :new
end
end
private
def post_params
params.require(:post).permit(:duration, :video)
end
如果验证失败,表单显示值 place
,但我丢失了视频的文件名。这意味着用户必须再次选择文件。我该如何解决?
按照 Thanh 的建议,我确实检查了这个 问题,并尝试将 simple_form 字段更改为
<%= f.hidden_field :video, value: f.object.image.signed_id if f.object.video.attached? %>
<%= f.file_field :video %>
这个记住了文件名,但是没有显示出来。所以我做了以下工作:
<% if f.object.video.attached? %>
<span><strong>Video File Name:</strong> <%= f.object.video.blob.filename.to_s %>. To change, choose different file below:</span>
<% end %>
<%= f.hidden_field :video, value: f.object.image.signed_id if f.object.video.attached? %>
<%= f.file_field :video %>
在 rails 5.2.3
应用程序中,我有一个模型 Post
,它使用 active_storage 来附加文件并具有 duration
和 place
的字段. duration
必须存在。
class Post
has_one_attached :video
validates :duration, presence: true
end
使用simple_form
表单中的字段声明为
<%= f.input :duration %>
<%= f.input :place %>
<%= f.input :video %>
控制器具有以下创建逻辑
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = 'Post has been saved'
redirect_to root_path
else
@title = 'New Post'
@user = current_user
render :new
end
end
private
def post_params
params.require(:post).permit(:duration, :video)
end
如果验证失败,表单显示值 place
,但我丢失了视频的文件名。这意味着用户必须再次选择文件。我该如何解决?
按照 Thanh 的建议,我确实检查了这个
<%= f.hidden_field :video, value: f.object.image.signed_id if f.object.video.attached? %>
<%= f.file_field :video %>
这个记住了文件名,但是没有显示出来。所以我做了以下工作:
<% if f.object.video.attached? %>
<span><strong>Video File Name:</strong> <%= f.object.video.blob.filename.to_s %>. To change, choose different file below:</span>
<% end %>
<%= f.hidden_field :video, value: f.object.image.signed_id if f.object.video.attached? %>
<%= f.file_field :video %>