我想构建反馈表单,将其发送到某个电子邮箱。每个表单属于许多页面(但页面只有一个表单),有一个标题和正文,可以有一个电子邮件。现在它的工作原理如下:
app/views/shared/_custom_form.html.slim
= form_for @feedback, method: :post, url: feedback_path, remote: true do |f|
fieldset.b-form-field style='display:none'
= f.text_field :email, value: @feedback.email
fieldset.b-form-field
= f.label :title, "Title"
= f.text_field :title, value: @feedback.title
fieldset.b-form-field
= f.text_field :body, value: @feedback.body
fieldset.b-form-field
= f.submit "Send"
app/controllers/pages_controller.rb
class PagesController < FrontendController
def show
@feedback = Feedback.new
end
end
app/controllers/feedback_controller.rb
class FeedbackController < FrontendController
def new
@feedback = Feedback.new
end
def create
@feedback = Feedback.new(feedback_params)
respond_to do |format|
if @feedback.valid?
eml_sett =
if feedback_params[:email]
feedback_params[:email]
else
setting_value(:main_email)
end
if eml_sett.present?
FeedbackMailer.feedback_message(@feedback, eml_sett).deliver
end
end
end
end
def feedback_params
params.require(:feedback).permit(:title, :body, :email)
end
因此,在我的视图中创建了@feedback,然后它从页面控制器转到feedback_controller,在那里它将被发送到表单所有者或默认电子邮件地址。它工作得很好(我知道,最好使用hidden_field,但它是原始项目),但我想完全隐藏html代码中的电子邮件地址。所以,我试着在我看来:
= form_for @feedback(email: 'test@test.com')...
= form_for @feedback...
- @feedback.email = 'test@test.com'
= form_for Feedback.new(email: 'test@test.com')
但没有任何帮助。如果我运行&#39; - puts @ feedback.email&#39;在我看来,它会返回电子邮件的价值,但在反馈控制器&#39; puts feedback_params [:email]&#39;什么都不返回,表单被发送到默认电子邮箱。我究竟做错了什么?哪里出错了?使用Rails 4.1.8 / Ruby 2.2.0。
答案 0 :(得分:0)
我猜您的pages#show
操作会显示一个通用页面,其中包含“注册简报”类型的表单。但是,由于您希望捕获更多数据,因此您现在要将用户流引导至反馈页面,该页面在feedback#new
处提供。
如果是这样,您可以做的是让pages#show
表单在feedback#new
上提交GET请求,如下所示:
= form_for :feedback, url: new_feedback_path, method: :get do |f|
= f.input :email
= f.submit
在feedback#new
行动中,您可以执行以下操作:
def new
@feedback = Feedback.new(feedback_params)
end
如果您在强力参数中使用require(:feedback)
,那么如果您想在不先发送电子邮件的情况下允许访问新操作,这将是一个问题,但我会留下让您自行决定是否我想支持那个。
你所说的使用隐藏字段,你无法避免它,因为它是用户输入。因此,无论您是将其作为可编辑输入字段启用,还是将其隐藏,用户都可以在第一页上提供任何值pages#show
。
如果您需要隐藏电子邮件,那么您可以在任何地方都不需要表单字段。这是你在控制器中做的事情:
def create
@feedback = Feedback.new(feedback_params)
FeedbackMailer.feedback_message(@feedback).deliver
end
在你的邮件中:
class FeedbackMailer < ApplicationMailer
def feedback_notification(feedback)
@feedback = feedback
mail(to: admin_email, from: @feedback.email, subject: @feedback.title)
end
private
def admin_email
ENV['ADMIN_EMAIL']
end
end
答案 1 :(得分:0)
试试这个:
form_for @feedback... do |f|
= f.hidden_field :email