我想建立反馈表单,将其正文发送到某个电子邮箱。每个表单属于多个页面(但页面只有一个表单),有一个标题和正文,并且可以有一封电子邮件。现在它是这样工作的:
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')但没有任何帮助。如果我在视图中运行'- puts @feedback.email‘,它会返回电子邮件值,但在反馈控制器中,'puts feedback_params:email’不会返回任何内容,表单会发送到默认的电子邮件框中。我做错了什么?错误在哪里?使用Rails 4.1.8/Ruby 2.2.0。
发布于 2017-09-29 23:34:31
我猜您的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
endhttps://stackoverflow.com/questions/46490735
复制相似问题