Я новичок в Rails и пытаюсь сделать следующее, но чувствую, что делаю это небезопасно:

Посетитель моего сайта может видеть страницы профилей пользователей и связываться с ними без регистрации. Между пользователями и посетителями существует связь has_and_belongs_to_many. Когда посетитель связывается с пользователем, я хочу создать новую запись в моей таблице посетителей с информацией, которую они отправляют, и создать новую связь в таблице users_visitors, чтобы позже я мог показать пользователю отправленную информацию. Что у меня есть на данный момент:

< STRONG> модели :

class User < ActiveRecord::Base
has_and_belongs_to_many :visitors

class Visitor < ActiveRecord::Base
has_and_belongs_to_many :users

views: user / profile.html.erb

#this is at example.com/user/id
<%= form_for Visitor.new, :url => contact_path, :html => { :method => :post } do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= submit_tag("Submit") %>
<% end %>

routes.rb

#this will just point to a confirmation page
post '/contact',  to:  'visitors#contact', :as => :contact

Я теряюсь в двух частях: как передать / использовать идентификатор пользователя, необходимый для создания отношения, и как должен выглядеть контроллер (или модель) для создания этих новых отношений?

0
crix 12 Янв 2013 в 21:10

1 ответ

Лучший ответ

Во-первых, я считаю, что это не лучший маршрут.

post '/contact',  to:  'visitors#contact', :as => :contact

На мой взгляд, это действие contact следует разместить на вашем контроллере Users, а не на вашем контроллере Visitors; в конце концов, вы обращаетесь к User , верно?

Вместо этого вам будет полезен такой маршрут, как (я не использую ресурсоемкие маршруты, потому что понятия не имею, как выглядит остальная часть вашего config/routes.rb)

post '/users/:id/contact',  to:  'users#contact', :as => :contact

Тогда ваш метод contact в вашем UsersController может выглядеть так

def contact
  @user = User.find(params[:id]) # this is how you get the user the visitor is contacting

  @visitor = Visitor.create(params[:visitor])
  @visitor.users << @user # this associates the User with the Visitor
end

Вышеупомянутое должно работать, но это упрощенный пример (я не занимаюсь проверкой; я не перенаправляю посетителя куда-то после; я на самом деле не связываюсь с пользователем) - Вам нужно будет конкретизировать это действие, чтобы оно соответствовало вашим потребностям.

1
deefour 12 Янв 2013 в 21:21
Большое спасибо! Это именно то, что я пытался выяснить. Я буду продолжать дополнять код проверками и т.д., просто не хотел заставлять кого-то думать обо всем :)
 – 
crix
12 Янв 2013 в 21:49