为什么渲染模板后无法访问模型错误?

时间:2019-01-06 13:05:12

标签: ruby-on-rails ruby validation activerecord

我在Message模型中有一个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文件

<%= 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}]}>

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

2 个答案:

答案 0 :(得分:0)

使用full_messages而不是手动遍历所有错误实例:

更改

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

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

答案 1 :(得分:0)

好像您正在隐藏message变量:

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

尝试重命名

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