如何创建这个Ruby on Rails表单?

时间:2010-07-18 21:22:24

标签: ruby-on-rails ruby

我的路线如下:

map.newsletter '/newsletter', :controller => "newsletter" , :action => "newsletter_signup"

还有NewsletterController和Newsletter模型。问题是,我想让我的控制器保持一个简单的方法,newsletter_signup。在那里,我只是检查请求是post类型还是get类型。如果它是一个获得,我只是回馈一个静态HTML视图,感谢您注册我们的新闻通讯。如果是帖子,我想创建一个新的通讯模型并签署用户。理想情况下,我想将此表单嵌入到我的主页中,该主页不会调用新闻通讯控制器。我认为http://example/newsletter/1http://example/newsletter/new等网址没有多大意义,因此我设置上述路线的方式只有http://example/newsletter才有效。

我将如何创建此表单?它接受一个字段,只是一个用户电子邮件的文本字段。一旦他们点击提交,它应该POST到newsletter控制器和newsletter_signup方法。由于这个表单将在我的应用程序的每个页面的页脚中,我是否需要在我的默认控制器/操作中执行类似@newsletter = Newsletter.new的操作?

2 个答案:

答案 0 :(得分:2)

你提议的不是 Rails方式,但是如果你真的想这样做,你的控制器动作可以访问你可以调用的request对象{ {1}}或get?来测试方法类型。有关详细信息,请参阅here

创建表单可能如下所示:

post?

更新:根据提问者的要求提供更多颜色:

不可否认,我有点不清楚你在注册简报(你想要GET for)和用POST唱歌之间的区别。是否您的应用程序还允许用户注册除了简报以外的服务?

在进行数据库更改并且GET用于读取操作时,使用惯用的POST / PUT / DELETE。令我感到震惊的是,两种注册都是数据库写入(即你必须在某处存储电子邮件地址,并在某处存储用户信息)。

我认为您只需在<% form_for(Newsletter.new, :url => { :action => "newsletter_signup" }, :html => { :method => :post}) do |f| %> <%= f.text_field :email_address %> <%= f.submit "Signup" %> <% end %> 中进行create操作(POST)即可进行简报注册。注册可能是在NewslettersController表中添加一个地址,这需要创建并保存news_letters模型的中间步骤。

用户注册(如果我理解正确的话),我猜你已经开始了。所以简而言之,我认为你正在处理这两种情况的NewsLetter操作。不需要POST。有意义吗?

答案 1 :(得分:2)

AFAIK,执行此操作的“Rails方式”是使用map.resourcemap.resources,如果默认名称没有意义,您可以使用:path_names选项重命名它们

例如:

map.resource :newsletter, :only => [:new, :destroy], :path_names => { :new => 'signup', :destroy => 'unsign' }

修改

我刚刚意识到我错过了相当于“创建”的东西,它将用于实际更新数据库(“新”将呈现一个页面询问用户是否想要注册新闻稿)。因此,如果您想要包含嵌入在另一个页面中的操作号召,那么可能不需要“新”路线。

制作控制器和路线

在这种情况下,我们并没有真正谈论新闻简报资源,而是简报注册资源。这意味着控制器将命名为 NewsletterSignup ,以下路线更合适:

map.resource :newsletter_signup, :only => [:create, :destroy]

这样您就可以将链接/按钮嵌入到现有页面中,该页面可以发送注册或从简报中取消签名的请求。这些链接背后的操作将使用正常操作和重定向模式来执行更新。

链接看起来像:

  POST to /newsletter_signup
DELETE to /newsletter_signup/1

显示消息

最后,显示消息“感谢您注册简报”的Rails方式是使用“flash消息”。这涉及NewsletterSignup控制器的create动作中的以下代码:

flash[:notice] = 'Thanks for signing up to the newsletter!'

您在页面视图中显示此操作然后重定向回到(注册链接/按钮打开的页面),然后可以包含消息:

<% if flash[:notice] %>
  <p class="notice"><%= flash[:notice] %></p>
<% end %>

如果通常使用,可以将上述片段添加到您的布局中,以便可以在任何页面上显示。