【问题标题】:Why i cant access model error after rendering template?为什么我在渲染模板后无法访问模型错误?
【发布时间】:2019-06-01 08:56:29
【问题描述】:

我在消息模型中有一个 vilatator,它在控制台上运行良好,但在渲染模板后我无法显示任何错误。 我的路线

resources :rooms do
  resources :messages
 end
resources :users

我的:新布局文件

<h1>New Message</h1>
<%= @message.errors.messages[:body] %>
<%= render 'form', message: @message %>

<%= link_to 'Back', room_messages_path %>

_表单文件

<%= form_with(model: message, url: room_messages_path(params['room_id'], 
 message) ) do |form| %>
 <% if message.errors.any? %>
  <div id="error_explanation">
  <h2><%= pluralize(message.errors.count, "error") %> prohibited this message from being saved:</h2>

  <ul>
     <% message.errors.messages.each do |message| %>
       <li><%= message %></li>
     <% end %>
  </ul>
  </div>
  <% end %>

 <div class="field">
   <%= form.label :body %>
   <%= form.text_area :body %>
 </div>

 <div class="actions">
   <%= form.submit %>
 </div>
<% end %>

我的控制器中的代码

def create
p message_params
@message = Message.new(message_params)
@message.room = Room.find(params[:room_id])
@message.user = @current_user
respond_to do |format|
  if @message.save
    format.html { redirect_to room_message_path(@message.room, @message), notice: 'Message was successfully created.' }
    format.json { render :show, status: :created }
  else
    p @message.errors
    format.html { render :action => :new }
    format.json { render json: @message.errors, status: :unprocessable_entity }
  end
end
end
def message_params
  params.require(:message).permit(:body)
end

我可以在控制器中看到消息错误,但我无法在布局文件中显示它们。

#<ActiveModel::Errors:0x00007f5525181100 @base=#<Message id: nil, body: "", created_at: nil, updated_at: nil, user_id: 7, room_id: 3>, @messages={:body=>["can't be blank"]}, @details={:body=>[{:error=>:blank}]}>

我不知道为什么它会以这种奇怪的方式工作,你能帮帮我吗?

【问题讨论】:

    标签: ruby-on-rails ruby validation activerecord


    【解决方案1】:

    使用full_messages 而不是手动迭代所有错误实例:

    改变

    <% message.errors.messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    

    <% message.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    

    【讨论】:

    • 它仍然不起作用,如果我将 @message.errors.messages[:body] 放在模板内的控制台中,我会看到错误,但是当我尝试渲染它时,它不会显示
    • 等等,你在视图中只使用消息而不是@message。您是否在某处重新分配变量?
    【解决方案2】:

    看起来你正在跟踪 message 变量:

     <% message.errors.messages.each do |message| %>
       <li><%= message %></li>
     <% end %>
    

    尝试重命名

     <% message.errors.messages.each do |err_message| %>
       <li><%= err_message %></li>
     <% end %>
    

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      相关资源
      最近更新 更多