2015-02-19 3 views
0

У меня есть форма редактирования/обновления, которые я настроить через form_for:respond_to путаница

<%= form_for(@vocab, url: user_vocab_path(@user, @vocab), remote: true) do |f| %> 
       <%= render 'shared/error_messages', object: f.object %> 

       <%= f.text_field :front, class: 'form-control' %> 
       <%= f.text_field :back, class: 'form-control' %> 

       <%= f.submit "Save", class: "btn btn-large btn-primary" %> 
       <%= link_to "Cancel", class: "btn btn-large" %> 
<% end %> 

В случае действительных данных, я хочу соответствующее действие обновления, чтобы сохранить изменения, и перенаправлять пользователя на котором он пришел. В этом случае нет необходимости в JS. В случае недопустимых данных я хочу, чтобы JS справлялся с ситуацией. Я поставил контроллер вверх, как это:

def update 
    @user = current_user 
    @vocab = @user.vocabs.find(params[:id]) 

    if @vocab.update_attributes(vocab_params) 
     flash[:notice] = "Vocab updated!" 
     respond_to do |format| 
     format.js { redirect_back_or(home_user_path(@user)) } 
     end 
    else 
     flash[:error] = "Vocab invalid!" 
     respond_to do |format| 
     format.html { render 'edit' } 
     format.js { render file: "vocabs/update.js" } 
     end 
    end 
end 

Проблема, которую я испытываю в том, что в случае действительных данных, сохраненный URL (study_setup) обрабатывается в JS, который предотвращает, что сторона загружается. Где я могу сказать Rails использовать JS для этого перенаправления?

Started PATCH "https://stackoverflow.com/users/1/vocabs/445" for 127.0.0.1 at 2015-02-19 18:03:16 +0100 
Processing by VocabsController#update as JS 
Parameters: {"utf8"=>"✓", "vocab"=>{"front"=>"kjhkkhsdsf1", "back"=>"jhgjhklj1"}, "commit"=>"Save", "user_id"=>"1", "id"=>"445"} 
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
Vocab Load (0.2ms) SELECT "vocabs".* FROM "vocabs" WHERE "vocabs"."user_id" = ? AND "vocabs"."id" = ? ORDER BY created_at DESC LIMIT 1 [["user_id", 1], ["id", 445]] 
(0.1ms) begin transaction 
Vocab Exists (0.3ms) SELECT 1 AS one FROM "vocabs" WHERE (LOWER("vocabs"."front") = LOWER('kjhkkhsdsf1') AND "vocabs"."id" != 445 AND "vocabs"."back" = 'jhgjhklj1' AND "vocabs"."user_id" = 1) LIMIT 1 
SQL (0.3ms) UPDATE "vocabs" SET "back" = ?, "updated_at" = ? WHERE "vocabs"."id" = 445 [["back", "jhgjhklj1"], ["updated_at", "2015-02-19 17:03:16.494941"]] 
(2.3ms) commit transaction 
Redirected to http://localhost:3000/users/1/study_setup 
Completed 302 Found in 17ms (ActiveRecord: 3.9ms) 


Started GET "https://stackoverflow.com/users/1/study_setup" for 127.0.0.1 at 2015-02-19 18:03:16 +0100 
Processing by UsersController#study_setup as JS 
Parameters: {"id"=>"1"} 
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
(0.1ms) begin transaction 
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE  (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
(0.1ms) commit transaction 
Tag Load (0.2ms) SELECT "tags".* FROM "tags" WHERE "tags"."user_id" = ? AND "tags"."active" = 't' [["user_id", 1]] 
Rendered users/_filter_form.html.erb (2.6ms) 
(0.2ms) SELECT COUNT(*) FROM "vocabs" WHERE "vocabs"."user_id" = ? [["user_id", 1]] 
Vocab Load (0.2ms) SELECT "vocabs".* FROM "vocabs" WHERE "vocabs"."user_id" = ? ORDER BY created_at DESC [["user_id", 1]] 
Rendered users/_vocab_list_for_selection.html.erb (2.1ms) 
Rendered users/study_setup.html.erb within layouts/application (8.9ms) 
Rendered layouts/_shim.html.erb (0.1ms) 
Rendered layouts/_header.html.erb (1.1ms) 
Completed 200 OK in 237ms (Views: 227.5ms | ActiveRecord: 1.7ms) 

ответ

1

remote: true говорит Rails, чтобы отправить запрос AJAX на сервер.

+0

Это объясняет, почему первый запрос обрабатывается как JS, но не второй. Второй причиной является метод redirect_back_to, который является простым «переадресацией на». Или я полностью ошибаюсь? – Flip

Смежные вопросы