Перенаправление вложенных ресурсов Rails после обновления

merovingian спросил: 14 ноября 2017 в 05:38 в: ruby-on-rails

Всем доброго времени суток, на этом я причесываюсь, я видел похожие посты, но ни одна из них не подталкивает меня в том направлении, в котором я пытаюсь идти. Тем не менее, у меня довольно сложный приложение, которое в значительной степени зависит от вложенных ресурсов и пространства имен, когда я сохраняю запись, она отлично сохраняет и перенаправляет правильно. Когда я обновляю ту же запись, URL меняется, но не так, как я ожидал. Я понимаю процесс перехода от редактирования к обновлению и вызова set_input с использованием параметров [: id]. Я не понимаю, почему URL-адрес изменяет ресурс родителей для отображения идентификатора записи.

/servers/1/features/rsyslog_inputs/12/edit"

изменяется на следующее после обновления

/servers/12/features/rsyslog_inputs/12/edit"

LOGS

Started GET "/servers/1/features/rsyslog_inputs/12/edit" for 127.0.0.1  at 2017-12-08 12:27:55 -0600
Processing by Features::RsyslogInputsController#edit as HTML
  Parameters: {"server_id"=>"1", "id"=>"12"}
  RsyslogInput Load (0.6ms)  SELECT  "rsyslog_inputs".* FROM "rsyslog_inputs" WHERE "rsyslog_inputs"."id" = $1 LIMIT $2  [["id", 12], ["LIMIT", 1]]
  Rendering features/rsyslog_inputs/edit.html.erb within layouts/application
  Rendered shared/_error_messages.html.erb (0.4ms) [cache miss]
  Rendered features/rsyslog_inputs/_form.html.erb (4.3ms) [cache miss]
  Rendered features/rsyslog_inputs/edit.html.erb within layouts/application (6.5ms)
  Rendered layouts/_shim.html.erb (0.5ms) [cache miss]
  User Load (1.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Rendered layouts/_navbar_top.html.erb (0.9ms) [cache miss]
  Rendered layouts/_navbar_side.html.erb (0.5ms) [cache miss]
  Completed 200 OK in 90ms (Views: 84.7ms | ActiveRecord: 1.7ms)

Здесь PATCH имеет изменил серверы /: id для отображения идентификатора rsyslog_inputs и не сохранил его "1", как показано выше

Started PATCH "/servers/12/features/rsyslog_inputs/12" for 127.0.0.1 at 2017-12-08 12:27:58 -0600
Processing by Features::RsyslogInputsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"dFt61NcQWXoKpmScrkngT47ZxDdhzMUcCyJ5fZKrdbaOVqKfLXMVeBUj20zKKHQ8wGe4fi2QEw98cLviyO4wQw==", "rsyslog_input"=>{"inputs_interface"=>"eth04", "inputs_ip_address"=>"1.1.1.1", "inputs_input_type"=>"tcp", "inputs_port_number"=>"22", "inputs_input_name"=>"test02", "inputs_tls"=>"0"}, "commit"=>"Save Input", "appliance_id"=>"12", "id"=>"12"}
  RsyslogInput Load (0.7ms)  SELECT  "rsyslog_inputs".* FROM "rsyslog_inputs" WHERE "rsyslog_inputs"."id" = $1 LIMIT $2  [["id", 12], ["LIMIT", 1]]
  (0.6ms)  BEGIN
  Server Load (1.0ms)  SELECT  "servers".* FROM "servers" WHERE   "servers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  SQL (1.0ms)  UPDATE "rsyslog_inputs" SET "inputs_interface" = $1, "updated_at" = $2 WHERE "rsyslog_inputs"."id" = $3  [["inputs_interface", "eth04"], ["updated_at", "2017-12-08 18:27:58.904817"], ["id", 12]]
 (0.8ms)  COMMITRedirected to http://localhost:3000/servers/12/features/rsyslog_inputs
Completed 302 Found in 12ms (ActiveRecord: 4.0ms) 

Controller

class Features::RsyslogInputsController < ApplicationController
  before_action :set_input, only: [:show, :edit, :update, :destroy]  def index
    # Let's search for all inputs associated with the corresponding appliance
    @inputs = RsyslogInput.where(server_id: params[:server_id])
  end  def create
    @input = RsyslogInput.new(input_params)
    @input.build_server
    @input.server_id = params[:server_id]
    if @input.save
      flash[:notice] = "Input was successfully saved."
      redirect_to server_features_rsyslog_inputs_path
    else
      render('new')
    end
  end  def destroy
    if @input.destroy
      flash[:notice] = "Input was successfully destoryed."
      redirect_to server_features_rsyslog_inputs_path
    else
      flash[:alert] = "Unable to destroy #{@input.inputs_input_name}"
    end
  end  def update    if @input.update(input_params)
      flash[:notice] = "Input was successfully updated"
      redirect_to server_features_rsyslog_inputs_path 
    else
      render('edit')
    end
  end  def new
    @input = RsyslogInput.new
  end  def edit; end  def show ;end  private  def set_input
    @input = RsyslogInput.find(params[:id])
  end  def input_params
    params.require(:rsyslog_input).permit(:inputs_interface,
                                  :inputs_input_type,
                                  :inputs_ip_address,
                                  :inputs_port_number,
                                  :inputs_input_name,
                                  :inputs_tls,
                                  :server_id)
  endend
Форма
<%= form_for ([:server, :features, @input]) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>
    <br/>    <div class="form-group  clients-form-container">
      <%= f.label :inputs_interface, 'Input interface:', class: 'col-3 col-form-label' %>
      <div class="col-3">
        <%= f.text_field :inputs_interface, class: 'form-control', placeholder: 'Enter Interface: (e.g. eth0)' %>
      </div>
      <br/>      <%= f.label :inputs_ip_address, 'Input IP Address:', class: 'col-3 col-form-label' %>
      <div class="col-3">
        <%= f.text_field :inputs_ip_address, class: 'form-control', placeholder: 'Enter IP Address:' %>
      </div>
      <br/>      <%= f.label :inputs_input_type, 'Input type:', class: 'col-3 col-form-label' %>
      <div class="col-3">
        <%= f.text_field :inputs_input_type, class: 'form-control', placeholder: 'TCP/UDP' %>
      </div>
      <br/>      <%= f.label :inputs_port_number, 'Input port number:', class: 'col-3 col-form-label' %>
      <div class="col-3">
        <%= f.text_field :inputs_port_number, class: 'form-control', placeholder: 'Enter Port:' %>
      </div>
      <br/>      <%= f.label :inputs_input_name, 'Input Name:', class: 'col-3 col-form-label' %>
      <div class="col-3">
        <%= f.text_field :inputs_input_name, class: 'form-control', placeholder: 'Enter Ruleset Name)' %>
      </div>
      <br/>
      <div class="form-inline">
        <%= f.label :inputs_tls, 'Enable TLS:', class: 'col-1 col-form-label' %>
        <div class="col-3">
          <%= f.check_box :inputs_tls, class: 'form-control check-box-alignment' %>
        </div>
      </div>
    </div>    <%= f.submit 'Save Input', class: 'btn btn-primary btn-lg' %>
    <%= link_to 'Cancel', :back, class: 'btn btn-secondary region-btn btn-lg' %>
<% end %>
<br/>
Маршруты
resources :servers do
    namespace :features do
      resources :rsyslog_inputs
      resources :rsyslog, only: :index
    end
  end  server_features_rsyslog_inputs            GET     /servers/:server_id/features/rsyslog_inputs(.:format)          features/rsyslog_inputs#index
                                            POST    /servers/:server_id/features/rsyslog_inputs(.:format)          features/rsyslog_inputs#create
 new_server_features_rsyslog_input          GET     /servers/:server_id/features/rsyslog_inputs/new(.:format)      features/rsyslog_inputs#new
edit_server_features_rsyslog_input          GET     /servers/:server_id/features/rsyslog_inputs/:id/edit(.:format) features/rsyslog_inputs#edit
     server_features_rsyslog_input          GET     /servers/:server_id/features/rsyslog_inputs/:id(.:format)      features/rsyslog_inputs#show
                                            PATCH   /servers/:server_id/features/rsyslog_inputs/:id(.:format)      features/rsyslog_inputs#update
                                            PUT     /servers/:server_id/features/rsyslog_inputs/:id(.:format)      features/rsyslog_inputs#update
                                            DELETE  /servers/:server_id/features/rsyslog_inputs/:id(.:format)      features/rsyslog_inputs#destroy
     server_features_rsyslog_index          GET     /servers/:server_id/features/rsyslog_inputs(.:format)          features/rsyslog_inputs#index

0 ответов