【问题标题】:Create Model from unrelated View on Rails 3.0在 Rails 3.0 上从不相关的视图创建模型
【发布时间】:2011-06-10 04:03:38
【问题描述】:

我正在尝试做一些相当简单的事情,但我不确定 Rails 的方法。最简单的是,我有一个索引页面,您可以在其中注册一个邮件列表。

我正在尝试进行设置,以便您可以从索引页面将自己添加到邮件列表中,而无需查看邮件列表视图。我可以使用以下方式正确提交数据:

= 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"

使用控制器:

def create
  @mailing_list = MailingList.new(params[:mailing_list])
  if @mailing_list.save
    redirect_to(:root, :notice => 'Mailing list was successfully created.') 
  else
    ? How do I return the errors ?
  end
end

但我无法恢复错误(即电子邮件无效等)。有没有更好的方法来做我正在尝试的事情?我希望能够从索引页面视图中调用并响应 MailingList 控制器的操作...

【问题讨论】:

  • 你想要 :remote => true 吗?
  • 不是真的,这只是我对 ruby​​ 的缺乏经验。我希望在没有 ajax 的情况下完成这一切。我应该发布到索引页面控制器并从那里创建一个邮件列表条目,而不是发布到邮件列表控制器吗?
  • 我觉得你很好。如果您不想使用 AJAX,只需删除 :remote => true 即可。但是,我喜欢不必将用户从页面中移出的能力。尝试将用户重定向回来很痛苦。试试下面的代码,让我知道你的想法。
  • @natedavidsolds 感谢您的帮助,您的代码是我以前的代码,但它会将我移动到 /mailing_list,而不是在出现错误时让我继续运行(成功时,一切都很好)

标签: ruby-on-rails ruby-on-rails-3 view controller


【解决方案1】:

我相信您需要一个无需离开页面即可将某人添加到邮件列表的表单。

更好?嗯..好吧,我会告诉你我做什么,你可以决定你喜欢什么。

我会在控制器中使用respond_to 来区分标准html 调用和远程js 调用。然后,我将处理视图中的页面更改。我喜欢在视图中保留显示。

控制器:

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();

【讨论】:

    【解决方案2】:

    您可以对@mailing_list 上的错误对象做一些事情,例如

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2013-09-10
      相关资源
      最近更新 更多