Rails: как определить контроллер / действие в представлении

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Это моя частичная форма:

 <%= f.simple_fields_for :photo_attributes, :html => { :multipart => true } do |d| %>
    <%= d.label :image, :label => 'Upload logo', :required => false  %>
    <%= d.file_field :image, :label => 'Image, :required => false', :style => 'margin-bottom:2px'  %>
    <%= d.input :image_url, :label => 'Billed URL', :required => false %>
<% end %>
  

Если действие edit, я хочу показать это вместо:

 <%= f.simple_fields_for :photo, :html => { :multipart => true } do |d| %>
    <%= d.label :image, :label => 'Upload logo', :required => false  %>
    <%= d.file_field :image, :label => 'Image, :required => false', :style => 'margin-bottom:2px'  %>
    <%= d.input :image_url, :label => 'Billed URL', :required => false %>
<% end %>
  

Как я могу этого добиться?

Ответ №1:

current_page?(action: 'edit')

Смотрите ActionView::Помощники::UrlHelper#current_page?

Rails также делает методы controller_path , controller_name action_name доступными для использования в представлении.

Комментарии:

1. Это должно быть принятым ответом — current_page? потрясающе.

2. Хм. Я видел случаи, когда это работает не так, как ожидалось. т.е. когда controller_name == 'site' и action_name == 'home' , но current_page?(controller: 'site', action: 'home') возвращает false .

3. Согласен. Этот ответ — именно то, что вы ищете.

4. Внимание! метод current_page не работает с запросом post. Например, представьте страницу Facebook / login. Когда вы находитесь на странице входа в систему, в заголовке вы видите кнопку регистрации, а когда вы находитесь в разделе регистрация, на нем отображается кнопка входа в систему. Если вы создадите такую логику, используя метод текущей страницы, то в конечном итоге, когда вы отправляете форму входа или регистрации и получаете сообщение об ошибке, на странице появятся две кнопки. Итак, страница снова отобразится с ошибкой, и ваш метод не будет работать. Итак, в этом случае используйте что-то вроде этого: if controller_name == ‘home’ amp;amp; action_name == ‘login’

Ответ №2:

Как правило, часть формы содержит только поля, а не тег формы или поля для, но если у вас нет другого способа, вы всегда можете увидеть, что params[:action] установлено в данный момент, и вести себя соответствующим образом.

Ответ №3:

Вы могли бы написать что-то вроде

 <%- form_url = @object.new_record? ? :photo_attributes : :photo %>
<% f.simple_fields_for form_url, :html => { :multipart => true } do |d| %>
  

То есть, если у вас есть @object для проверки. В противном случае вы могли бы использовать action_name (и даже controller_name ).

Итак, что-то вроде:

 <%- form_url = action_name == :edit ? :photo : :photo_attributes %>
<% f.simple_fields_for form_url, :html => { :multipart => true } do |d| %>
  

Надеюсь, это поможет.

Ответ №4:

Rails 5: отображать действие в представлении

 <%= action_name %>
  

Оператор If в представлении

 <% if action_name == "edit" %>
  This is an edit action.
<% end %>
  

Ответ №5:

Просто используйте @_controller.action_name в представлении