简体   繁体   中英

Rails: one view, model and it's associated model

So, for example, case from http://guides.rubyonrails.org/getting_started.html As you can see, if you try to create invalid post, you will see error messages:

    <%= form_for @post do |f| %>
        <% if @post.errors.any? %>
      <div id="errorExplanation">
        <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
        <ul>
        <% @post.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
        </ul>
      </div>
      <% end %>
      <p>
        <%= f.label :title %><br>
        <%= f.text_field :title %>
      </p>

      <p>
        <%= f.label :text %><br>
        <%= f.text_area :text %>
      </p>

      <p>
        <%= f.submit %>
      </p>
    <% end %>

How to implement error messages rendering for associated Comment model, keeping in mind that comment creation form is placed in posts/show view?

Form code is usually kept in the folder of the matching model in a _form.html.erb partial that is rendered in both new.html.erb and edit.html.erb (to see a good example, generate a scaffold for a sample model).

What you can do in your case is render this comments form partial in the posts show action.

app/views/posts/show.html.erb
  <%= render 'comments/form', comment: @comment || @post.comments.build # Whatever you have here %>

app/views/comments/_form.html.erb
  <%= form_for comment do |f| %>
    <%= render 'error_messages', target: comment %>
    ...
  <% end %>

In addition, showing error messages usually is the same in all forms, so in order to remove duplication, you can extract this code into a seperate partial.

app/views/application/error_messages.html.slim # here is slim syntax, convert as nescessary
/ error explanation
/
/ = render 'shared/error_explanation', target: @school
/
- if target.errors.any?
  .error-messages
    h4 Please correct the following fields:
    ul
      - target.errors.full_messages.each do |message|
        li = message

Hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM