Ruby on Rails - Отправка вложенной формы ресурса не сохраняет, выдает «Цепочка фильтров остановлена ​​как: require_no_authentication отрисовано или перенаправлено» - PullRequest
0 голосов
/ 11 января 2019

РЕДАКТИРОВАТЬ Два: Журнал сервера:

Started POST "/users" for IPADDRESS at 2019-01-15 11:02:29 +1100
Processing by Users::UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"TOKEN", "search_address"=>{"search_address"=>"1 Dr Carlton B Goodlett Pl, San Francisco, CA 94102, USA"}, "commit"=>"Save Search Address"}
  User Load (1.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 24]]
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 19ms (ActiveRecord: 1.6ms)

РЕДАКТИРОВАТЬ : Быстрая заметка, но в пользовательских контроллерах у них нет вызова before_action. И я хочу, чтобы только пользователи logged_in имели доступ к странице поиска и методу обновления.

Получение цепочки фильтров, прерванной во вложенной форме ресурса. Что мне добавить в приведенном ниже коде, чтобы убедиться, что отправленная форма сохранена в соответствующей таблице?

У меня есть модель «Пользователь и адрес поиска», цель состоит в том, чтобы пользователь мог ввести адрес, сохраненный в таблице адресов поиска. Моя проблема, как только пользователь отправляет форму, я получаю ошибку аутентификации.

Я прочитал в стеке о добавлении чего-то такого, как:

prepend_before_filter :require_no_authentication, only: [:cancel ]

Но я не уверен, куда его поместить и даже тогда, где бы я поместил его в свой код? Я поместил код ранее в моем контроллере пользователя и получил последующие ошибки. Следовательно, почему мне интересно знать, есть ли другой способ решить мою проблему или, если нет, что я должен делать правильно, используя приведенный выше код.

Я удалил некоторый код, чтобы его было легче понять.

Вид:

<%= semantic_form_for @user do |f| %>

    <%= fields_for :search_address, @user.build_search_address do |g| %>
      <div class="field">
        <%= g.label :search_address, 'Search Address' %>
        <br/>
        <%= g.text_field :search_address, :class => "form-control" %>
      </div>
    <% end %>

    <%= f.submit 'Save Search Address' %>
  <% end %>

Схема:

  create_table "search_addresses", force: :cascade do |t|
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
    t.string   "search_address"
    t.float    "latitude"
    t.float    "longitude"
    t.integer  "user_id"
  end

  add_index "search_addresses", ["user_id"], name: "index_search_addresses_on_user_id", using: :btree

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "address"
    t.string   "username"
  end

Модель пользователя:

class User < ActiveRecord::Base
  has_one :search_address, dependent: :destroy, :foreign_key => 'user_id'
  accepts_nested_attributes_for :search_address
  geocoded_by :address, :latitude => :latitude, :longitude => :longitude
  after_validation :geocode
end

Поиск модели адреса:

class SearchAddress < ActiveRecord::Base
  belongs_to :user, :foreign_key => 'user_id'
  geocoded_by :search_address, :latitude => :latitude, :longitude => :longitude
end

Пользовательский контроллер:

  def search_page
    @user = User.new
    @user.build_search_address
  end

  def update
    @users = User.find(params[:id])
    @users.update_attributes!(user_params)
        redirect_to :back
  end

  def user_params
    params.require(:user)
    params[:user].permit(:email, search_addresses_attributes: [:search_address])
  end

end

1 Ответ

0 голосов
/ 15 января 2019

Похоже, я понял это. Давайте посмотрим на действия вашего контроллера и журналы сервера. Вы отправляете форму в действии search_address и хотите перейти к обновлению действия. Но вы определяете @user в действии search_address как User.new, и поэтому вы переходите к действию создания (Processing by Users::UsersController#create as HTML в журналах сервера). Ваш пользователь вошел в систему, но для создания действия не требуются зарегистрированные пользователи (обычно оно срабатывает при регистрации), поэтому вы получаете Filter chain halted as :require_no_authentication rendered or redirected.

Если я правильно понял, вы хотите обновить search_address для текущего пользователя. Должно быть:

# Users::UsersController
def search_page
end

def update
  current_user.update_attributes!(user_params)
  # it's always a good idea to specify what to do, if accidentally there is no "back"
  redirect_back(fallback_location: root_path)
end

def user_params
  params.require(:user).permit(:email, search_address_attributes: [:search_address])
end

# search_address.html.erb
<%= semantic_form_for current_user do |f| %>
  <% f.object.search_address ||= f.object.build_search_address %>
  <%= fields_for :search_address do |addr| %>
    <div class="field">
      <%= addr.label :search_address, 'Search Address' %>
      <br/>
      <%= addr.text_field :search_address, :class => "form-control" %>
    </div>
  <% end %>

  <%= f.submit 'Save Search Address' %>
<% end %>

Я вижу некоторые проблемы с вложенными параметрами в журнале сервера (это "search_address"=>{}, должно быть "search_address_attributes"=>{}), но это должно быть исправлено после обновления формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...