控制器方法:联系表单应根据表单的使用位置呈现不同的页面

时间:2015-06-15 19:23:42

标签: ruby-on-rails ruby forms ruby-on-rails-4 controller

我在专用于此表单的特殊页面上有联系表单。专用控制器包括:

def new
  @message = Message.new
end

def create
  @message = Message.new(message_params)
  if @message.valid?
    MessageMailer.new_message(@message).deliver_now
    flash[:success] = "Thank you!"
    redirect_to contact_path
  else
    render 'new'
  end
end

现在我还希望在我的主页底部包含此表单。我已将html添加到视图中并将其添加到主页的控制器:

  def home
    @message = Message.new
  end

表单现在也适用于主页。但问题是:如果我在主页上提交表单,它会重定向到特殊联系页面(因为redirect_to contact_path)。如果出现错误,也会转到特殊联系页面(因为render 'new')。

解决这个问题的最有效方法是什么,以便在使用表单的情况下在主页上呈现表单(一直在底部)?使用de特殊联系页面上的表格,它当然应该呈现该页面。我看到的唯一解决方案是编写单独的控制器方法,但感觉就像它需要的那样复杂化。或者我可以以某种方式使用current_page?方法吗?

更新:我尝试render current_page?(contact_path) ? 'new' : 'controllername/home',但这会生成错误消息:undefined method 'current_page?'

根据要求,主页上的表格:

<%= form_for @message, url: contact_path do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.text_field :name, placeholder: 'Name' %>
  <%= f.email_field :email, placeholder: 'Email' %>
  <%= f.text_area :content, placeholder: 'Your message…' %>
  <%= f.submit "Post message" %>
<% end %>

单独页面上的表格:

<%= form_for @message, url: contact_path do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.label :name %>
  <%= f.text_field :name, placeholder: 'Name', class: 'form-control' %>

  <%= f.label :email %>
  <%= f.email_field :email, placeholder: 'Email', class: 'form-control' %>

  <%= f.label :content %>
  <%= f.text_area :content, placeholder: 'Your message…', class: 'form-control' %>

  <%= f.submit "Send", class: "btn btn-primary" %>
<% end %>

1 个答案:

答案 0 :(得分:0)

您可以在Rails 4中使用名为action_name的内容。action_name为您提供视图被触发的操作的名称。现在,您可以通过隐藏字段将此属性发送到方法create,如下所示:

<%= hidden_field_tag "action_name", action_name %>

这行代码会将params[:action_name]发送到create方法。然后,在create方法中,您可以检查请求的来源,并采取适当的措施。