开发者

Create Model from unrelated View on Rails 3.0

I'm trying to do something fairly simple but I'm not sure the rails way to do it. At its simplest, I have an index page where you can sign up for a mailing list.

I'm trying to set it up so that you can add yourself to the mailing list from the index page without ever seeing the mailing list views. I can submit the data properly using something like:

= form_for @mailing_list, :remote => true do |form| 
= if @mailing_list.errors.any?
  %ul
  = @mailing_list.errors.full_messages.each do |message| 
    %li
      = message
.field
  = form.label :email, 'Your email'
  = form.text_field :email
= form.submit "Add to Mailing List"

With the controller:

def create
  @mailing_list = MailingList.new(params[:mailing_list])
  if @mailing_list.save
    redirect_to(:root, :notice => 'Mailing list was successfully cre开发者_开发问答ated.') 
  else
    ? How do I return the errors ?
  end
end

But I am unable to get the errors back (ie. Email not valid, etc.). Is there a better way to do what I'm attempting? I would just like to be able to call and respond to actions of the MailingList controller from the index page view...


I believe that you are wanting a form that will add someone to a Mailing list without leaving that page.

Better? Hmmm.. Well, I'll tell you what I do and you can decide what you like.

I would use respond_to in the controller to differentiate between the standard html call and the remote js call. Then, I would handle the page changes in the view. I like keeping the display in the views.

Controller:

def create
    @mailing_list = MailingList.new(params[:mailing_list])
    if @mailing_list.save
        respond_to do |format|
            format.html { redirect_to(:root, :notice => 'Mailing list was successfully created.') }
            format.js { render }    
        end 
    else
        respond_to do |format|
            format.html { render }
            format.js { render :errors }
        end
    end
end

create.js.erb

$('#errors').html('').hide();
$('form').html('Mailing list was successfully created.'); // needs a better element

errors.js.erb

$('#errors').html('<%= escape_javascript(@mailing_list.errors.full_messages.collect { |msg| content_tag :li, msg }.join().html_safe) %>').show();


You can do something with the errors object on @mailing_list, e.g.

flash.now[:error] = @mailing_list.errors.full_messages
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜