rails同一页面上不同控制器的两种形式

Posted

技术标签:

【中文标题】rails同一页面上不同控制器的两种形式【英文标题】:Two forms for different controllers on same page in rails 【发布时间】:2012-05-10 15:50:32 【问题描述】:

更新:


下面的问题源于对用户进行身份验证的 before_filter。


我在同一页面上有两个表单,两个不同的 form_for,每个都有不同的模型。它们如下,并且都在设计/会话/新视图中:

%h2 Sign in
= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
  %div
    = f.label :email
    %br/
    = f.email_field :email
  %div
    = f.label :password
    %br/
    = f.password_field :password
  - if devise_mapping.rememberable?
    %div
      = f.check_box :remember_me
      = f.label :remember_me
  %div= f.submit "Sign in"
= render :partial => "devise/shared/links"

=form_for BetaSignUp.new do |f|
  .field
    = f.label :email, "Your Email:"
    = f.text_field :email
  .actions
    = f.submit 'Submit'

但是,当在 betasignup 表单中输入新电子邮件时,它不会像在 views/beta_sign_ups/new 视图中具有相同表单时那样保存到数据库中。为什么是这样?我需要对其中一个控制器或路由做些什么吗?

beta_sign_ups_controller:

class BetaSignUpsController < ApplicationController
  def new
    @beta_sign_up = BetaSignUp.new

    respond_to do |format|
      format.html # new.html.erb
      format.json  render json: @beta_sign_up 
    end
  end

  def create
    @beta_sign_up = BetaSignUp.new(params[:beta_sign_up])

    respond_to do |format|
      if @beta_sign_up.save
        format.html  redirect_to root_path, notice: 'Thank you for signing up.  You will be notified when we expand the beta group.' 
        format.json  render json: @beta_sign_up, status: :created, location: @beta_sign_up 
      else
        format.html  render action: "new" 
        format.json  render json: @beta_sign_up.errors, status: :unprocessable_entity 
      end
    end
  end
end

betasignups 表单的 html 输出:

<form accept-charset="UTF-8" action="/beta_sign_ups" class="new_beta_sign_up" id="new_beta_sign_up" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="K4wlzIZ958PdaC91vV4NMu4PLm3TF+yVebN0ll2VuoI="></div>
<div class="field">
<label for="beta_sign_up_email">Your Email:</label>
<input id="beta_sign_up_email" name="beta_sign_up[email]" size="30" type="text">
</div>
<div class="actions">
<input name="commit" type="submit" value="Submit">
</div>
</form>

提交到 betasignups 表单后,服务器日志的输出:

Started POST "/beta_sign_ups" for 127.0.0.1 at 2012-05-10 11:36:17 -0400
  Processing by BetaSignUpsController#create as HTML
  Parameters: "utf8"=>"✓", "authenticity_token"=>"K4wlzIZ958PdaC91vV4NMu4PLm3TF+yVebN0ll2VuoI=", "beta_sign_up"=>"email"=>"onebroadway@test.com", "commit"=>"Submit"
Completed   in 35ms

【问题讨论】:

第二种形式的html输出是什么?你有 beta_sign_ups 控制器吗? 已编辑问题以包含这些内容。 啊,问题出在有一个对用户进行身份验证的 before_filter 【参考方案1】:

您仍然可以使用 before_filter,只需向它传递一些选项,以便它只会在特定操作上激活,或者将它用于替代 skip_before_filter 用于您在表单中使用的任何控制器操作。

【讨论】:

以上是关于rails同一页面上不同控制器的两种形式的主要内容,如果未能解决你的问题,请参考以下文章

前端路由的两种实现方式

响应式布局的两种实现形式

Rails的不同缓存策略

同一页面上两个不同控制器的Angularjs双向绑定字段[重复]

每个动作的 Rails 布局?

我可以在rails中的单个页面中呈现两个不同的控制器操作