#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 в представлении