Этот код основан на учебнике Ruby on Rails от Michael Hartl. Я создал assigned
действие в моей users_controller
сНет совпадений маршрута в коде Rails
def assign
puts "in assign..."
@scout = User.find(params[:follower_id])
@der = User.find(params[:followed_id])
end
Я понимаю, что ничего не делает в настоящее время, но в _follow
частичной, у меня есть
<%= form_for @user, url: { action: "assign" } do |f| %>
<div><%= hidden_field_tag :follower_id, @user.id %></div>
<%= f.label :followed_id, "Assign #{@user.name} to" %>
<%= f.collection_select :following, @ders, :id, :name, prompt: true %>
<%= f.submit "Assign", class: "btn btn-primary" %>
<% end %>
Но я получаю ошибку No route matches {:action=>"assign", :controller=>"users", :id=>"4"}
. Я новичок в рельсах, так что это может быть просто глупый вопрос. Что я делаю не так? Нужно ли мне изменить файл routes.rb
? Кроме того, если я попробовал <%= form_for @user do |f| %>
, как контроллер знает, какое действие использовать? Это основано на действии, отображающем форму?
Edit: мой routes.rb
файл
Rails.application.routes.draw do
root 'static_pages#home'
get 'help' => 'static_pages#help'
get 'about' => 'static_pages#about'
get 'contact' => 'static_pages#contact'
get 'signup' => 'users#new'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
resources :users do
member do
get :following, :followers
end
end
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :relationships, only: [:create, :destroy]
end
Edit 2: HTML генерируется @form_for
блок Рича является
<form class="edit_user" id="edit_user_5" action="https://stackoverflow.com/users/5/assign" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="_method" value="patch">
<input type="hidden" name="authenticity_token" value="...">
<label for="user_followed_id">Assign Mr. Marley Muller to</label>
<select name="user[following]" id="user_following">
<option value="1">Example User</option>
<option value="2">Matthew Swartz</option>
<option value="3">Joseph Swartz</option>
</select>
<input type="submit" name="commit" value="Assign" class="btn btn-primary">
</form>
Который имеет смысл, почему я сейчас получаю не могу найти id, так как он не отправляет реальный идентификатор (edit_user_5
)
Редактировать 3: Вот параметры, передаваемые для запроса
Started PATCH "https://stackoverflow.com/users/6/assign" for 68.100.59.128 at 2015-12-15 03:54:39 +0000
Processing by UsersController#assign as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"following"=>"2"}, "commit"=>"Assign", "id"=>"6"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 6]]
Unpermitted parameter: following
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", nil]]
Completed 404 Not Found in 9ms (ActiveRecord: 1.0ms)
ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):
app/controllers/users_controller.rb:69:in `assign'
Редактировать 4: При следующем файле маршрутов,
Rails.application.routes.draw do
root 'static_pages#home'
get 'help' => 'static_pages#help'
get 'about' => 'static_pages#about'
get 'contact' => 'static_pages#contact'
get 'signup' => 'users#new'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
resources :users do
member do
get :following, :followers
match :assign, to: :assign, via: [:post, :patch]
end
end
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :relationships, only: [:create, :destroy]
end
и следующая форма для присвоения одному пользователю следовать за другим,
<%= form_for @user, url: { action: "assign" } do |f| %>
<%= f.label :follower_id, "Assign #{@user.name} to" %>
<%= f.collection_select :following, @ders, :id, :name, prompt: true %>
<%= f.submit "Assign", class: "btn btn-primary" %>
<% end %>
Я получаю ActiveRecord::RecordNotFound in UsersController#assign
ошибку Couldn't find User with 'id'=
, но со следующими параметрами:
{"utf8"=>"✓",
"_method"=>"patch",
"authenticity_token"=>"...",
"user"=>{"following"=>"3"},
"commit"=>"Assign",
"id"=>"4"}
Идентификаторы верны: "user"=>{"following"=>"3"}
и "id"=>"4"
, я считаю, что я просто пытаюсь получить к ним доступ неправильно. Это действие назначает в пользовательском контроллере:
def assign
@scout = User.find(params[:id])
@der = User.find(params_hash[:followed_id])
# make scout follow der here
redirect_to @scout
end
Мысли?
показать свой 'routes.rb' файл пожалуйста. –
Как это работает, вам нужно определить маршрут в файле 'routes.rb', который отображается на действие контроллера. Итак, сообщение об ошибке, которое вы получили, потому что либо вы не определили маршрут, либо вы сделали это неправильно. –
@KMRakibulIslam, см. Мое редактирование – mjswartz