Несколько контактных форм - Рельсы 3 - PullRequest
0 голосов
/ 07 ноября 2011

Я относительный новичок во всем этом, так что извините, если это звучит безумно!

Я использовал этот урок: http://www.railsmine.net/2010/03/rails-3-action-mailer-example.html

И у меня работает новая форма контактаотлично.

Контроллер находится в app / controllers / support_controller.rb

class SupportsController < ApplicationController
  def new
    # id is required to deal with form
    @support = Support.new(:id => 1)
   end

  def create
    @support = Support.new(params[:support])
    if @support.save
      redirect_to('/', :notice => "Support was successfully sent.")
    else
      flash[:alert] = "You must fill all fields."
      render 'new'
    end
  end
end

А модель в /app/models/support.rb

class Support
  include ActiveModel::Validations

  validates_presence_of :email, :sender_name, :support_type, :content
  # to deal with form, you must have an id attribute
  attr_accessor :id, :email, :sender_name, :support_type, :content

  def initialize(attributes = {})
    attributes.each do |key, value|
      self.send("#{key}=", value)
    end
    @attributes = attributes
  end

  def read_attribute_for_validation(key)
    @attributes[key]
  end

  def to_key
  end

  def save
    if self.valid?
      Notifier.support_notification(self).deliver!
      return true
    end
    return false
  end
end

Однако представления работают только в views / support / new.html.rb (предоставлено - views / support / _form.html.erb)

Таким образом, я могу вызывать модель / контроллер из localhost: 3000 / support / new, ноесли я пытаюсь отобразить ту же форму в другом виде из корневого каталога, например, app / view / contact.html.erb, я получаю:

undefined method `model_name' for NilClass:Class

Я думаю, это потому, что она вызывает модель поддержки изкаталог поддержки.

Нужно ли создавать экземпляр @support, чтобы его можно было вызывать?Если так, каков наилучший способ сделать это?Я думаю, что я почти там.Я просто хочу контактную форму на нескольких страницах, а не только в support / new

Спасибо

Charlie

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Да, вам нужно будет создать переменную @support в каждом действии, которое вы хотите визуализировать.

Другим вариантом может быть рефакторинг формы для получения параметра, чтобы вы были более гибкими.Например, с вашей точки зрения:

<%= render :partial => "supports/form", :locals => {:support => @support} %>

Теперь, вместо того, чтобы ссылаться на @support в вашем _form.html.erb, вы будете ссылаться просто на support, так как это local_assign.

Еще одним вариантом было бы реорганизовать форму немного дальше и беспокоиться о создании фактического тега form вне партиала.

Например:

app/views/supports/new.html.erb

<%= form_for @support do |form| %>
  <%= render :partial => "suppports/form", :object => form %>
<% end %>

app/views/supports/_form.html.erb

<%= form.text_field :foo %>
<%= form.text_field :bar %>
...

В этом случае, когда вы рендерите partial с опцией object, вы получите локальную переменную в вашем партиале с тем же именем, что ичастичное.Вы сохраняете немного большую гибкость в пути своей формы, но все равно можете визуализировать, что находится внутри формы Support, оставаясь единообразными во всем приложении.

Чтобы уточнить, вы могли быиспользуйте это где-нибудь еще, выполнив что-то вроде:

app/views/foos/_create_foo_support.html.erb

<%= form_for @foo.support do |form| %>
   <%= render :partial => "supports/form", :object => form %>
<% end %>
1 голос
/ 07 ноября 2011

Вы должны передать @support объект везде, где вы используете свою контактную форму.Он работает в SupportsController#new, потому что вы инициализируете переменную там.Во всех других местах, где вы хотите использовать форму, вам придется делать то же самое.

...