rails - 通过get请求将值从视图传递到控制器

时间:2017-07-03 15:41:25

标签: ruby-on-rails routes

用户填写的表格如下:

简化版......

<%= form_for @email, url: email_path(@email) do |f| %>

<%= f.text_field :subject, class: "form-control" %>

<div class="tooltip-demo" style="margin-top:20px;margin-left:10px">
      <%= link_to "Preview", preview_email_path, class: "btn btn-sm btn-primary preview", remote: true %>
    </div>

<% end %>

在我的电子邮件控制器中,我有一个如下所示的方法:

def preview

    print "Email sent!"

    print params.to_json

    respond_to do |format|
      format.json { head :no_content }
      format.js { } 
    end
end

如何将文本域:subject中的值传递给我的预览方法才能验证?

这就是我的路线看起来......如果重要:

get :preview_email, to: "emails#preview"

2 个答案:

答案 0 :(得分:0)

在提交表单之前,您没有使用附加所有表单信息的Rails表单助手。

所以一种方法是删除emails#preview操作,只留下email操作。

然后在您的表单中,您可以有多个submit按钮,如下所示:

 <%= f.submit "Preview" 
 <%= f.submit "Submit"

最后在您的控制器中,您可以分离一些逻辑,只需检查具有内容commit的参数Preview(如果用户已按下预览按钮)或Submit

答案 1 :(得分:0)

我不知道您可以在路线中添加可选参数的方式,在link_to中进行设置,然后在不使用JS的情况下进行更改。

但我认为你可以尝试定义你的路线:

get '/preview_email', to: 'emails#preview', as: 'preview_email'

然后你的控制器就像你一样:

def preview
  print "Email sent!"
  print params.to_json
  respond_to do |format|
    format.json { head :no_content }
    format.js { } 
  end
end

我认为最大的变化是在您看来,当您可以省略remote: :true中的link_to部分和路线定义时,从表单输入和用户处获取主题点击“预览”链接,通过email_preview路径向该方法发出AJAX请求,这样,您就可以收到主题,并且可以进行所需的任何验证:

  

没有路由,它是'',但是id可以让您的JS脚本可以访问它。所以,你得到preview锚,添加一个点击监听器,当用户点击它时,然后使用preventDefault()来停止正常运行,然后创建一个变量来获取{{{ 1}}输入标记,并使用email[subject]使请求传递主题变量值并捕获错误:

fetch