将Rails表单移动到单独的视图中

时间:2018-10-01 14:42:54

标签: ruby-on-rails

我的rails 5应用程序中有一个表单,该表单接收用户数据并将其存储在mysql数据库中。

一切正常。但是,我想将此表单移到一个单独的视图中,该视图与其类名/模型,控制器名称和视图不对应。

能否仅通过将表单作为部分视图呈现到单独的视图中来完成此操作?

任何建议都会很棒。

控制器文件:

class UserLeadsController < ApplicationController

  def index
    @user_lead = UserLead.all
  end

  def new
    @user_lead = UserLead.new

    @lead_reasons = LeadReason.all.map{ |r| [r.name, r.id] }
    @lead_sources = LeadSource.all.map{ |s| [s.name, s.id] }
  end

  def create
    @user_lead = UserLead.new(user_lead_params)
    @user_lead.lead_reason_id = params[:lead_reason_id]
    @user_lead.lead_source_id = params[:lead_source_id]

    @user_lead.save

    redirect_to user_leads_path
  end

  private

  def user_lead_params
    params.require(:user_lead).permit(:name, :businessname, :phone, :email, :amount)
  end
end

可以说这是UserLeadController,我想将其窗体的一部分放置到HomeController内部的视图中吗?能做到吗?

这是局部的,它告诉我@user_lead为零或为空?我似乎看不到这是怎么回事?

<%= form_for @user_lead, url: user_leads_path, html: {class: 'col-12'}, remote: true do |f| %>
        <div class="col-12 px-0 text-center">
          <h4 class="fl-color-navy">Some heading here</h4>
        </div>
        <div class="col-12 progress-container-center">
          <div class="col-12 progress-bar-block">
            <div class="progress-bar">
              <ol class="progress-steps">
                <li class="progress-step step1 current-step" style="width: 0%;"> <span class="count highlight-index"></span></li>
                <li class="progress-step step2 current-step" style="width: 100%;"> <span class="count"></span></li>
              </ol>
            </div>
          </div>
        </div> ....

1 个答案:

答案 0 :(得分:0)

部分渲染表单可以正常工作。如果视图正确(提交UserLeadsController#create,问题不包括视图代码),则提交表单会将浏览器正常引导到控制器。

如果像@lead_reasons@lead_sources之类的东西对于渲染视图很重要,那就有些棘手了。当然,在简单的情况下,partial可以直接内联,例如,您还可以添加一个辅助方法,该方法获取这些方法,然后将通过的部分内容呈现给locals参数。例如

module ApplicationHelper
    def user_leads_form
        lead_reasons = LeadReason.all.map{ |r| [r.name, r.id] }
        lead_sources = LeadSource.all.map{ |s| [s.name, s.id] }
        render partial: "user_leads_form", locals: {lead_reasons: lead_reasons, lead_sources: lead_sources}
    end
end

在某些情况下,如果您希望它返回上一页,例如对于验证错误,您可能需要通过在表单中​​添加参数或检查Referer请求标头(故意拼写错误!)来添加。

如果您希望它根本不离开页面,那么那就是进入客户端脚本解决方案了。