首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails -将隐藏参数发送到新表单

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

Stack Overflow用户
提问于 2017-09-29 22:15:46
回答 2查看 789关注 0票数 0

我想建立反馈表单,将其正文发送到某个电子邮箱。每个表单属于多个页面(但页面只有一个表单),有一个标题和正文,并且可以有一封电子邮件。现在它是这样工作的:

代码语言:javascript
运行
复制
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代码。所以,我试着在我的观点中:

代码语言:javascript
运行
复制
= 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。

EN

Stack Overflow用户

发布于 2017-09-29 23:34:31

我猜您的pages#show操作显示了一个通用页面,其中包含“注册订阅时事通讯”类型的表单。但是,由于您希望捕获更多数据,因此现在需要将用户流定向到一个反馈页面,该页面由feedback#new提供。

如果是这样的话,您可以做的是让pages#show表单在feedback#new上提交一个GET请求,如下所示:

代码语言:javascript
运行
复制
= form_for :feedback, url: new_feedback_path, method: :get do |f|
  = f.input :email
  = f.submit

在您的feedback#new操作中,您可以这样做:

代码语言:javascript
运行
复制
def new
  @feedback = Feedback.new(feedback_params)
end

如果你在你的强参数中使用require(:feedback),那么如果你想在不提供电子邮件的情况下允许访问新的操作,那么这将是一个问题,但我会让你决定是否想要支持它。

你所说的关于使用隐藏字段,你不能避免它,因为它是用户输入。因此,无论您是否将其作为可编辑输入字段启用,还是将其隐藏,用户都可以在第一个页面上提供任何值,即pages#show

如果您需要的是隐藏电子邮件,那么是的,您不需要任何地方的表单字段。这是你在你的控制器中做的事情:

代码语言:javascript
运行
复制
def create
  @feedback = Feedback.new(feedback_params)   
  FeedbackMailer.feedback_message(@feedback).deliver
end

在你的邮件里:

代码语言:javascript
运行
复制
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
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46490735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档