не могу передать параметр через link_to (рельсы) - PullRequest
0 голосов
/ 30 октября 2011

У меня проблема с передачей параметров. в представлении у меня есть

= link_to "Отправить сообщение", {: controller => "users",: action => "send_message",: user_id => @ user.id}

и мой users_controller имеет метод

def send_message
    @user = User.find(params[:user_id])
    @message=Message.new
    redirect_to send_message_path
end

и мой метод показа

def show
    @user = User.find(params[:id])
    @post=Post.new
    @posts=@user.posts.reverse.paginate(:page => params[:page],:per_page => 10)  
  end

но у меня есть ошибка после нажатия на ссылку

Не удалось найти пользователя без идентификатора

в этой строке, в методе send_message

 @user = User.find(params[:user_id])

что я делаю не так? Я читал много примеров по этому поводу, но это не работает (

Заранее спасибо !!!

Ответы [ 3 ]

1 голос
/ 30 октября 2011
=link_to "Send message", [:send_message, @user]

и в ваших маршрутах:

resources :users do
  post :send_message, :on => :collection
end
1 голос
/ 30 октября 2011

Что произойдет, если вы попытаетесь изменить: user_id на: id, например,

=link_to "Send message", {:controller => "users", :action => "send_message", :id => @user.id}

def send_message
    @user = User.find(params[:id])
    @message=Message.new
    redirect_to send_message_path
end

Если это работает, это потому, что ваш маршрут не настроен на использование параметра: user_id.Если этого не произойдет, это поможет узнать больше о вашем маршруте.

0 голосов
/ 30 октября 2011

В ваших маршрутах вы должны написать:

resources :users do
  post :send_message, :on => :member
end

И, по вашему мнению, вы напишите:

= link_to "Send Message", send_message_user_path(@user)

Это будет использовать id вместо user_id.Так что в вашем контроллере вам также нужно использовать params[:id].

Имхо, это чище, чем решение @ fl00r, потому что это метод-член, а не коллекция.

Но янемного смущен тем, почему у вас вообще будет этот метод внутри контроллера.Потому что единственное, что он делает, это перенаправляет на send_message_path в любом случае.Все переменные экземпляра будут потеряны.Поэтому вместо этого, на ваш взгляд, напишите это:

= link_to 'Send message', send_message_path(:user_id => @user.id)

И это сразу отправит вас к правильному контроллеру (где вам придется искать пользователя).

Также ваш show методМожно использовать некоторую работу: вы должны определить has_many :posts в вашей User модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...