我是Rails的新手,我试图做以下事情,但我有一种感觉,我做得不安全:
访问我的网站可以看到用户的个人资料页面,并与他们联系,而无需注册。用户和访问者之间存在has_and_belongs_to_many关系。当访问者联系用户时,我希望在访问者表中创建一条包含他们提交的信息的新记录,并在users_visitors表中创建一个新关系,以便稍后向用户显示提交的信息。到目前为止我有什么:
模型:
class User < ActiveRecord::Base
has_and_belongs_to_many :visitors
class Visitor < ActiveRecord::Base
has_and_belongs_to_many :users
视图:用户/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
我迷失了两个部分:我如何传递/使用创建关系所需的用户id,以及控制器(或模型)应该是什么样子来创建这个新关系?
首先,我认为这条路线不是最好的
post '/contact', to: 'visitors#contact', :as => :contact
在我看来,这个contact
动作应该放在你的Users
控制器上,而不是你的Visitors
控制器上;毕竟,你联系的是 User
,对吧?
您反而会受益于像这样的路由(我没有使用资源路由,因为我不知道您的config/routes.rb
的其余部分是什么样子)
post '/users/:id/contact', to: 'users#contact', :as => :contact
你的UsersController
中的contact
方法可能看起来像
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
上面应该工作,但是一个简化的例子(我不处理验证;我并没有把访问者重新引导到某个地方;我实际上并没有联系用户) -您需要充实这个动作以满足您的需求。