Rails - 将隐藏参数发送到新表单

时间:2017-09-29 14:15:46

标签: ruby-on-rails ruby forms

我想构建反馈表单,将其发送到某个电子邮箱。每个表单属于许多页面(但页面只有一个表单),有一个标题和正文,可以有一个电子邮件。现在它的工作原理如下:

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。

2 个答案:

答案 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