Rails 7中flash alert无法在application.html.erb显示问题
Rails 7中Alert提示无法显示的解决方案
问题根源
Rails 中 redirect_to 方法的 :alert/:notice 参数会将消息存入跨请求的flash存储,而 render 方法的同名参数仅会设置当前请求的实例变量@alert/@notice。你视图中使用的 alert 是Rails内置助手方法,默认读取的是 flash[:alert],而非 render 生成的@alert实例变量,因此alert消息无法显示。
解决方案
方案1:使用flash.now设置alert(推荐,无需修改视图)
修改控制器的create方法else分支,用flash.now替代alert参数,确保消息存入当前请求的flash:
def create @rescue = AnimalRescue.new(rescue_params) respond_to do |format| if @rescue.save format.html { redirect_to animal_rescue_url(@rescue), notice: "Rescue was successfully created." } format.json { render :show, status: :created, location: @rescue } else Rails.logger.info "FAILED" format.html do flash.now[:alert] = "Unable to create rescue." render :new, status: :unprocessable_entity end format.json { render json: @rescue.errors, status: :unprocessable_entity } end end end
方案2:修改视图使用实例变量
保持控制器代码不变,将视图中读取alert的逻辑改为使用@alert实例变量:
<% if @alert %> <% debugger %> <div class="notification is-danger is-light text-center"> <%= @alert %> </div> <% end %>
验证方法
触发debugger时,在控制台分别输入alert和@alert:
alert会返回nil(因为flash[:alert]为空)@alert会返回你设置的"Unable to create rescue.",以此确认问题所在。
内容的提问来源于stack exchange,提问作者Misha Krul
相关产品推荐
相关产品推荐

