Rails: каков «правильный» (идиоматический) способ передачи параметра из new для создания в контроллере RESTful? - PullRequest
2 голосов
/ 08 февраля 2010

У меня очень распространенная ситуация и решение, но я хотел бы спросить экспертов Rails, можно ли его улучшить.

У меня есть очень типичный контроллер RESTful, где пользователь предоставляет некоторые атрибуты объекта при создании. Существует модель thing, ThingsController и различные виды, в том числе new, create и частичное _form.

У вещи есть два атрибута,

  1. цвет , который устанавливается, когда они нажимают на ссылку, чтобы создать его (т. Е. Ссылку «Создать красное», которая кодирует идентификатор красного цвета в качестве параметра URL)
  2. описание , которое вводится пользователем в виде вида

Я доволен подходом к работе с атрибутом, таким как описание, которое пользователь указывает в форме, но менее уверен в способе обработки атрибута, который передается через параметры URL, связанные с первым нажмите кнопку.

Это то, чем я сейчас занимаюсь (обратите внимание, что я упустил проверку ошибок, чтобы упростить задачу). Во-первых, мои new и create методы в контроллере следующие:

def new
  @thing = Thing.new
  @thing.color = Color. find(params[:color])
end

def create
  @thing = Thing.new(params[:thing])
  @thing.color = Color. find(params[:color])

  if  @thing.save   
    flash[:notice] = "Successfully created thing."
    redirect_to somewhere_url
  else
    render :action => 'new'
  end
end

Представление new только вызывает частичное _form, которое выглядит следующим образом:

<% form_for @thing do |f| %>
  <%= f.error_messages %>

  <%= hidden_field_tag "color", @thing.color.id %>

  <%= f.label :description %>
  <%= f.text_area :description %>
  <%= f.submit "Submit" %>
<% end %>

Кажется немного беспорядочным передавать идентификатор цвета в метод create в качестве параметра URL, помещая скрытое поле в форму. Это выглядит разумно, или есть другой подход, который был бы лучше?

1 Ответ

3 голосов
/ 08 февраля 2010

Обычно в этой ситуации я бы помещал в форму скрытое поле, в котором будет находиться color_id. Хорошая вещь в этом способе заключается в том, что вы можете обойтись, просто установив цвет объекта, прежде чем визуализировать форму. Таким образом, ваш контроллер меняется на:

def new
  @thing = Thing.new
  @thing.color = Color. find(params[:color])  
end

def create
  @thing = Thing.new(params[:thing])
  if  @thing.save   
    flash[:notice] = "Successfully created thing."
    redirect_to somewhere_url
  else
    render :action => 'new'
  end
end

и ваша форма изменится на

<% form_for @thing do |f| %>
  <%= f.error_messages %>

  <%= f.hidden_field :color_id %>

  <%= f.label :description %>
  <%= f.text_area :description %>
  <%= f.submit "Submit" %>
<% end %>

Затем цвет передается через обе формы, и вам нужно только получить цвет в первой форме. (Не забудьте добавить проверки вашей модели Thing, чтобы убедиться, что она имеет правильный цвет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...