【问题标题】:Unable to submit form in Rails无法在 Rails 中提交表单
【发布时间】:2016-10-03 18:57:35
【问题描述】:

我有 2 个模型,称为讲师和请求关联在一起。我想提交一个属于讲师的请求,但在控制台上出现以下错误。有人可以帮助我吗?谢谢,

Processing by RequestsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"SaLDbXaZOy2cvGILrC9IJ7vInkF0xG42bf84k3IcDj+eFN9lTRfZlkGUMr8s82zQEdO9dgJ3Set935RGH8uv9w==", "request"=>{"name"=>"dsada", "email"=>"dsadas", "phone"=>"sadsadd", "message"=>"sadsa"}, "commit"=>"Create Request"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
No template found for RequestsController#create, rendering head :no_content
Completed 204 No Content in 38ms (ActiveRecord: 0.3ms)

申请表

    <hr>
<%= simple_form_for([@request, @instructor.requests.build], :url =>{ :controller =>"requests",
                                              :action => "create" }) do |f| %>
  <%= f.input :name, label: "Your name" %>
  <%= f.input :email %>
  <%= f.input :phone, label: "Phone number" %>
  <%= f.input :message, as: :text %>
  <br>
  <%= f.button :submit, class: "btn btn-danger" %>
<% end %>
<br>
<br>

请求控制器

    class RequestsController < ApplicationController

  def index
    if params[:search].present?
      @instructors = Instructor.near(params[:search], 50)
    else
      # Shows all listed instructors by the created date.
      @instructors = Instructor.order('created_at DESC')
    end
  end

  def show
    @instructor = Instructor.find(params[:id])
  end

  def create
    @request = Request.new(request_params)

    if @request.save
      redirect_to "root"
    end
  end

  private

  def request_params
    params.require(:request).permit(:name, :email, :phone, :message)
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 simple-form


    【解决方案1】:

    如果您的请求控制器嵌套在讲师下面,您可能的意思是:

    simple_form_for([@instructor, @instructor.requests.build], ...
    

    这些控制器也很常见:

    @instructor = Instructor.find(params[:id])
    @request = @instructor.requests.new(request_params)
    if @request.save
      # ...
    

    删除 :url =&gt;{ :controller =&gt;"requests", :action =&gt; "create" 的多余部分,表单生成器应该从 [@request, @instructor.requests.build] 中找出这一点

    如果@request 被保存,您将重定向到root_path,但如果请求失败(似乎是这种情况),您将不做任何事情,在这种情况下render "new" 也很常见。请参阅指南中的示例控制器:http://guides.rubyonrails.org/action_controller_overview.html#parameters

    最终您可以更改此默认行为,但我建议您从基础开始,并在您了解其工作原理后进行更改。

    【讨论】:

    • 我居然忘了在教练下缩进请求路由!
    • 不确定如何提交到这条路线?讲师请求 POST /instructors/:instructor_id/requests(.:format) requests#create
    • 很抱歉没有发布足够的信息。请看一下github上的github.com/FaisalFehad/instructor_finder
    • 你已经提交到那个路由了;我相信问题是在@request 没有保存时​​做出响应。
    【解决方案2】:

    您的模型无效,因此它不会重定向(因为save 返回false)。所以你需要重写update action:

    def create
      @request = Request.new(request_params)
    
      if @request.save
        redirect_to "root"
      else
        render :new
      end
    end
    

    更新:

    您使用的是 Rails 5.0,因此如果您声明 belongs_to,它还会为外键添加存在验证。因此,您需要以这种方式创建请求对象:

    @request = Instructor.find(params[:instructor_id]).requests.build(request_params)
    

    【讨论】:

    • 我不确定它为什么返回 false?也仍然得到(0.1ms)开始事务(0.1ms)回滚事务
    • 我没有看到你的模型,所以不能说它有什么验证。可以猜到,dsadas 不是有效邮箱
    • 我还没有任何验证!它唯一的(请求)belongs_to :instructor 和(instructor)has_many :requests
    • 很抱歉没有发布足够的信息。请查看 github 上的 github.com/FaisalFehad/instructor_finder
    • @Faisal 在查看了您的代码后,我在答案中添加了更新部分。
    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多