无法使用Rails将表单数据设置到数据库中

问题描述 投票:0回答:2

我有一个project_site模型,用户将名称文件上传到数据库中。另一个模型是project_manager,它接受和拒绝布尔字段和备注字段以及每个project_site条目。但是我无法将注释和状态布尔数据设置到project_manager数据库中。这是我的代码:

project_manager.rb

class ProjectManager < ApplicationRecord
  belongs_to :project_site
end

project_site.rb

class ProjectSite < ApplicationRecord
  has_many :project_managers, dependent: :destroy
  validates :name,:attendance, presence: true
end

project_manager_dashboard

  <table>
    <thead>
      <tr>
        <th>Uploaded By</th>
        <th>Attendance File</th>
        <th colspan="2"></th>
      </tr>
    </thead>

    <tbody>
      <% @project_sites.each do |project_site| %>
        <tr>
            <td><%= project_site.name.titleize %></td>
            <% if project_site.attendance? %>
              <td><%= link_to "View Attendance", project_site.attendance.url, :class => "fi-page-export-csv" %></td>
            <% else %>
              <td>No File Present</td>
            <% end %>

            <td>
              <%= form_for [ @project_site, @project_manager ] do |f| %>
                <div class="row">
                  <div class="medium-6 columns">
                    <%= f.radio_button :status, true  %>
                    <%= f.label :approve %>
                    <%= f.radio_button :status, false  %>
                    <%= f.label :reject %>
                  </div>
                  <br>
                  <br>
                  <div class="medium-6 cloumns">
                    <%= f.label :remark %><br/>
                    <%= f.text_area :remark %>
                  </div>

                    </div>
                  <div>
                    <%= f.submit 'Submit', :class => 'button primary' %>
                  </div>

              <% end %>
            </td>
            <td><%= link_to 'Action', project_site, :class=>'button tiny primary' %></td>
        </tr>
      <% end %>
    </tbody>
  </table>

project_manager_controller.rb

class ProjectManagersController < ApplicationController

  def index
   @project_sites = ProjectSite.all.order("created_at DESC").paginate(page: params[:page], per_page: 10)
   @project_manager = ProjectManager.new
   #@project_manager.project_site_id = @project_site.id
  end


  def create
     @project_manager = ProjectManager.new(remark_params)
    @project_manager.project_site_id = params[:project_site_id]
    @project_manager.save

    redirect_to project_managers_path
  end

  def remark_params
    params.require(:project_manager).permit(:remark, :status)
  end
end

routes.rb

  resources :project_sites
  resources :project_managers
ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5
2个回答
0
投票

控制器端

   class ProjectManagersController < ApplicationController

      def index
       @project_sites = ProjectSite.all.order("created_at DESC").paginate(page: params[:page], per_page: 10)
       @project_manager = ProjectManager.new
      end


      def create
        @project_manager = ProjectManager.new(remark_params)
        @project_manager.save

        redirect_to project_managers_path
      end

      def remark_params
        params.require(:project_manager).permit(:remark, :status, :project_site_id)
      end
    end

查看侧

<tbody>
  <% @project_sites.each do |project_site| %>
    <tr>
        <td><%= project_site.name.titleize %></td>
        <% if project_site.attendance? %>
          <td><%= link_to "View Attendance", project_site.attendance.url, :class => "fi-page-export-csv" %></td>
        <% else %>
          <td>No File Present</td>
        <% end %>

        <td>
          <%= form_for @project_manager do |f| %>
            <div class="row">
              <div class="medium-6 columns">
                <%= f.radio_button :status, true  %>
                <%= f.label :approve %>
                <%= f.radio_button :status, false  %>
                <%= f.label :reject %>
              </div>
              <br>
              <br>
              <div class="medium-6 cloumns">
                <%= f.label :remark %><br/>
                <%= f.text_area :remark %>
              </div>
                <%=f.hidden_field :project_site_id, value: project_site.id%>
                </div>
              <div>
                <%= f.submit 'Submit', :class => 'button primary' %>
              </div>

          <% end %>
        </td>
        <td><%= link_to 'Action', project_site, :class=>'button tiny primary' %></td>
    </tr>
  <% end %>
</tbody>

0
投票

您创建的表单是正确的,您需要一个嵌套表单,因为您正在为项目站点创建项目经理。但是,如果您的表单是嵌套的,则还需要嵌套的路由。对于创建新记录,它应如下所示:

routes.rb

resources :project_sites do
  resources :project_managers, only: [:create]
end

(这称为浅层嵌套,仅在创建新记录时嵌套)。这样,您不必在隐藏字段中传递项目站点ID,它将成为URL的一部分。

现在,这应该将http请求路由,当您单击表单上的“提交”时,该请求将提交到ProjectManagersController。那里的代码看起来不错。如果仍然没有创建记录,请在运行rails server的终端中检查日志。您可以看到POST请求的来源吗?仔细阅读所有内容,看看它们是否有意义。我有一种感觉,项目站点没有分配给项目经理,这就是为什么无法保存记录的原因。因为belongs_to :project_site中的project_manager.rb包含验证。是否有回滚功能,而不是保存preoject管理器?

© www.soinside.com 2019 - 2024. All rights reserved.