Ruby on rails 如何不同地使用带有静态页面控制器的联系人表单模型?

Ruby on rails 如何不同地使用带有静态页面控制器的联系人表单模型?,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我有一个静态PagesController和一个ProjectRequestsController,如下所示。非常基本。ProjectRequestsController充当一个简单的联系表单 我希望能够识别项目申请表是否已提交,无论是从一个页面还是另一个页面提交,例如,在保存时,将每个项目申请记录的属性设置为true或false 例如:如果表单是从主页提交的,请设置home=true,等等 我尝试将项目请求资源嵌套在页面下,但不起作用,因为我的页面没有任何ID 我想把hidden_字段的值从表

我有一个静态
PagesController
和一个
ProjectRequestsController
,如下所示。非常基本。
ProjectRequestsController
充当一个简单的联系表单

我希望能够识别项目申请表是否已提交,无论是从一个页面还是另一个页面提交,例如,在保存时,将每个项目申请记录的属性设置为
true
false

例如:如果表单是从主页提交的,请设置
home=true
,等等

我尝试将项目请求资源嵌套在页面下,但不起作用,因为我的页面没有任何ID

我想把
hidden_字段
的值从表单传递给我的控制器,但不知道如果我要这样做,该如何进行或处理

实现这一目标的最佳方式是什么

页面控制器

class PagesController < ApplicationController

  def home
  end

  # Landing pages
  def landing_one
    render 'pages/landings/landing_one/landing_home'
  end

  def landing_two
    render 'pages/landings/landing_two/landing_home'
  end  
  .... 
end
已编辑 添加ProjectRequestsController代码段。 现在看来是这样的。我以模态的形式呈现,escape JS。 因此,我的
new
操作绑定到我的
new.js.erb
,我正在通过它传递我的空shell
@new\u项目

class ProjectRequestsController < ApplicationController
  skip_before_action :authenticate_user!, only: [ :new, :create ]
  before_action :set_project, only: [:edit]

  def new
    @new_project = ProjectRequest.new
  end

  def create
    @new_project = ProjectRequest.new project_requests_params
    respond_to do |format|
      if @new_project.save
        format.html { redirect_to root_path }
        format.js
        flash[:notice] = t('controllers.projects.success')
        AdminNotificationMailer.new_project_notification(@new_project).deliver
      else
        format.html { render 'edit' }
        format.js
        flash[:alert] = t('controllers.projects.fail')
      end
    end
  end

  def edit
  end

  private

  def project_requests_params
    params.require(:project_request).permit(:name,
                                             :email,
                                             :description,
                                             :travel,
                                             :home)
  end

  def set_project
    @project = ProjectRequest.find(params[:id])
  end
end
class ProjectRequestsController
你就快到了

首先,在操作本身中设置有关窗体源的标志

def home
  @new_project = ProjectRequest.new(home: true)
end
这里我们设置
home:true
,以防表单在主页上呈现

现在在表单中,为每个登录页标志使用隐藏变量

<%= form_for @new_project do |f| %>
  <%= f.hidden_field :home %>
  <%= f.hidden_field :landing_one %>
  <%= f.hidden_field :landing_two %>
  ....and your other fields....
<% end %>

……还有你的其他领域。。。。
当您提交表单并在
create
操作中传递参数时,它会自动设置页面标志。

得到解决方案

我只是创建了以下帮助程序,并在我的
create
ProjectRequestsController
方法中使用了它

referer
允许我获取新项目请求路径的祖先URL,从而获取正在使用的
PagesController
方法

  def set_new_project_instance
    project = @new_project
    if request.referrer.include? ‘home’
      project.landing_one = true
    elsif request.referrer.include? ‘travel’
      project.landing_two = true
    end
    project.save
  end

谢谢阿米特,确认我的想法。然而,我确实意识到,在
PagesController
中实例化@new_project在这里是无用的,因为它来自
ProjectRequestsController
中的
new
方法。因此,它在此控制器中实例化一次,我无法将不同的project_请求的新实例传递到我的表单中。请您也添加
ProjectRequestsController
的片段,好吗?马上。刚刚贴出来。基本上,基于每个
PagesController
操作,我应该能够传递一个不同的
ProjectRequest
实例变量,其属性对应于该页面的操作。
  def set_new_project_instance
    project = @new_project
    if request.referrer.include? ‘home’
      project.landing_one = true
    elsif request.referrer.include? ‘travel’
      project.landing_two = true
    end
    project.save
  end