控制器方法:联系表单应根据使用表单的位置呈现不同的页面
Controller method: Contact form should render different page depending on where the form is used
我在专门用于此表格的特殊页面上有一个联系表格。专用控制器包括:
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 special contact 页面上的表单时,它当然应该仍然呈现该页面。我看到的唯一解决方案是编写单独的控制器方法,但感觉这会使它变得比需要的更复杂。或者我能以某种方式使用 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 %>
您可以在 Rails 4 中使用名为 action_name
的东西。action_name
为您提供触发视图的操作的名称。现在您可以通过如下所示的隐藏字段将此 属性 发送到方法 create
:
<%= hidden_field_tag "action_name", action_name %>
这行代码会将 params[:action_name]
发送到 create
方法中。然后,在 create
方法中检查请求的来源,并采取适当的措施。
我在专门用于此表格的特殊页面上有一个联系表格。专用控制器包括:
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 special contact 页面上的表单时,它当然应该仍然呈现该页面。我看到的唯一解决方案是编写单独的控制器方法,但感觉这会使它变得比需要的更复杂。或者我能以某种方式使用 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 %>
您可以在 Rails 4 中使用名为 action_name
的东西。action_name
为您提供触发视图的操作的名称。现在您可以通过如下所示的隐藏字段将此 属性 发送到方法 create
:
<%= hidden_field_tag "action_name", action_name %>
这行代码会将 params[:action_name]
发送到 create
方法中。然后,在 create
方法中检查请求的来源,并采取适当的措施。