我的路线如下:
map.newsletter '/newsletter', :controller => "newsletter" , :action => "newsletter_signup"
还有NewsletterController和Newsletter模型。问题是,我想让我的控制器保持一个简单的方法,newsletter_signup。在那里,我只是检查请求是post类型还是get类型。如果它是一个获得,我只是回馈一个静态HTML视图,感谢您注册我们的新闻通讯。如果是帖子,我想创建一个新的通讯模型并签署用户。理想情况下,我想将此表单嵌入到我的主页中,该主页不会调用新闻通讯控制器。我认为http://example/newsletter/1或http://example/newsletter/new等网址没有多大意义,因此我设置上述路线的方式只有http://example/newsletter才有效。
我将如何创建此表单?它接受一个字段,只是一个用户电子邮件的文本字段。一旦他们点击提交,它应该POST到newsletter控制器和newsletter_signup方法。由于这个表单将在我的应用程序的每个页面的页脚中,我是否需要在我的默认控制器/操作中执行类似@newsletter = Newsletter.new的操作?
答案 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.resource
或map.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 %>
如果通常使用,可以将上述片段添加到您的布局中,以便可以在任何页面上显示。