правильно создать действие объединения между пользователем и группой - PullRequest
0 голосов
/ 08 февраля 2012

У меня проблема при попытке создать членство для пользователей на основе имени, которое они вводят в форму членства - new.html.erb.

user.rb

  has_many :memberships, :dependent => :destroy
  has_many :groups, :through => :memberships

members.rb

class Membership < ActiveRecord::Base
  attr_accessible :user_id, :group_id
  belongs_to :user
  belongs_to :group
end

group.rb

  has_many :memberships, :dependent => :destroy
  has_many :users, :through => :memberships

членский контроллер

  def create
      @group = Group.find_by_name(:group)
      @membership = current_user.memberships.build(:group_id => @group.group_id)
      if @membership.save
        flash[:notice] = "You have joined this group."
        redirect_to :back
      else
        flash[:error] = "Unable to join."
        redirect_to :back
      end
    end

членство - _form.html.erb

<%= form_for(@membership) do |f| %>
  ...
  #error validation
  ...

  <div class="field">
    <%= f.label :group %><br />
    <%= f.text_field :group %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

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

1 Ответ

1 голос
/ 08 февраля 2012

Причина, по которой ваш код сейчас не работает, заключается в следующей строке:

@group = Group.find_by_name(:group)

это должно быть что-то вроде (я точно не помню, извините)

@group = Group.find_by_name(params[:membership][:group])

Ошибка вызывается на следующей строке, потому что @group равно nil.

Но вам, вероятно, все равно придется обрабатывать этот тип логики в модели с помощью виртуального атрибута или чего-то подобного.

membership.rb

def group_name
  if self.group
    @group_name ||= self.group.name
  end
end

def group_name=(group_name)
  @group_name = group_name

  self.group = Group.find_by_name(@group_name)
end

форма

<div class="field">
  <%= f.label :group_name, "Group" %><br />
  <%= f.text_field :group_name %>
</div>

контроллер

def create
  @membership = current_user.memberships.build(params[:membership])
  if @membership.save
    flash[:notice] = "You have joined this group."
    redirect_to :back
  else
    flash[:error] = "Unable to join."
    redirect_to :back
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...