Ongelma käyttäjien poistajien kanssa

9 views
Skip to first unread message
Message has been deleted

marika

unread,
Apr 16, 2009, 5:33:22 AM4/16/09
to Ruby on Rails: Finnish
Heippa!

Olen vasta opettelemassa Ruby on Railsia ja yritän tässä tehdä
ensimmäistä sovellusta.

Minulla on index.html.erb, jossa listataan käyttäjät.
<table>
<tr>
<th>Name</th>
</tr>
<% form_tag destroy_marked_users_path, :method => :put do %>
<% @users.each do |user| %>
<tr>
<td><%= check_box_tag "destroy_marked[]", user.id %>

<td><%=h user.name %></td>
<td><%= link_to 'Show', user_links_path(user) %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method
=> :delete %></td>
</tr>
<% end %>
<%= submit_tag "Delete marked" %>
<% end %>
</table>
<br />
<%= link_to 'New user', new_user_path %>

Sekä routes.rb:
map.root :controller => "home"
map.resources :users, :has_many => :links
map.resources :users, :collection => { :destroy_marked => :put }

user_controller.rb:ssä on:
def destroy_marked
@user.destroy_all(:id => params[:user_ids])
end

Tavoitteena on näyttää käyttäjien edessä checkboxit, joiden avulla
poistetaan useita käyttäjiä kerralla. Checkboxit näkyvät hienosti,
mutta eivät toimi :( Delete marked -painiketta painettaessa tulee
virheilmoitus: 'Couldn't find User with ID=destroy_marked'

Voi olla että olen aivan hukassa tämän kanssa, mutta lieneekö jotain
ratkaisua? Vaikka kuinka väännän ja käännän, en saa tuon id =
destroy_markedin tilalle käyttäjän id:tä..

Kiitos jo etukäteen :)

Jarkko Laine

unread,
Apr 16, 2009, 5:41:49 AM4/16/09
to finnis...@googlegroups.com
2009/4/16 marika <marika...@gmail.com>:
Sulla on nyt kaksi samannimistä resurssia joten ei ole mitään takeita
siitä kumpi toimii vai toimiiko kumpikaan. Lisää tuo
collection-parametri ensimmäisen map.resources :users -rivin
parametriksi.

Reitit tulkitaan järjestyksessä ylhäältä alas, joten todennäköisesti
/users/destroy_marked osuu tuohon ekaan riviin siten että
destroy_marked tulkitaan id-parametriksi.

Kannattaa myös aina katsoa (ja raportoida), miltä toiminnolta
virheilmoitus tulee. Sen näkee helposti lokitiedostosta (oletuksena
log/development.log).

//jarkko


>
> user_controller.rb:ssä on:
>  def destroy_marked
>    @user.destroy_all(:id => params[:user_ids])
>  end
>
> Tavoitteena on näyttää käyttäjien edessä checkboxit, joiden avulla
> poistetaan useita käyttäjiä kerralla. Checkboxit näkyvät hienosti,
> mutta eivät toimi :( Delete marked -painiketta painettaessa tulee
> virheilmoitus: 'Couldn't find User with ID=destroy_marked'
>
> Voi olla että olen aivan hukassa tämän kanssa, mutta lieneekö jotain
> ratkaisua? Vaikka kuinka väännän ja käännän, en saa tuon id =
> destroy_markedin tilalle käyttäjän id:tä..
>
> Kiitos jo etukäteen :)
> >
>



--
Jarkko Laine
http://jlaine.net
http://odesign.fi

marika

unread,
Apr 16, 2009, 5:57:56 AM4/16/09
to Ruby on Rails: Finnish
Sepä oli nopea vastaus :) Kiitti!

Pääsin pykälän taas eteenpäin, nyt välittyy checkboxeilta kaikki
user_ids:t eteenpäin (aiemmin oli vain 1). Mutta ilmeisen väärin,
koska ei vieläkään toimi:

Request
Parameters:
{"commit"=>"Delete marked",
"_method"=>"put",
"authenticity_token"=>"Ir9CWYijcM2LnHs1TShkUY6p4m4Czzl7+Cgyl+PEtVA=",
"user_ids"=>["10",
"11"],
"id"=>"destroy_marked"}

Eli edelleen ilmoitus 'Couldn't find User with ID=destroy_marked'. Ei
vaan raksuta aivoissa.

Kiitti muuten kurssista! Se oli hyödyllinen!


On 16 huhti, 12:41, Jarkko Laine <jar...@jlaine.net> wrote:
> 2009/4/16 marika <marika.aho...@gmail.com>:

Jarkko Laine

unread,
Apr 16, 2009, 6:07:19 AM4/16/09
to finnis...@googlegroups.com
2009/4/16 marika <marika...@gmail.com>:
>
> Sepä oli nopea vastaus :) Kiitti!
>
> Pääsin pykälän taas eteenpäin, nyt välittyy checkboxeilta kaikki
> user_ids:t eteenpäin (aiemmin oli vain 1). Mutta ilmeisen väärin,
> koska ei vieläkään toimi:
>
> Request
> Parameters:
> {"commit"=>"Delete marked",
>  "_method"=>"put",
>  "authenticity_token"=>"Ir9CWYijcM2LnHs1TShkUY6p4m4Czzl7+Cgyl+PEtVA=",
>  "user_ids"=>["10",
>  "11"],
>  "id"=>"destroy_marked"}
>
> Eli edelleen ilmoitus 'Couldn't find User with ID=destroy_marked'. Ei
> vaan raksuta aivoissa.

Edelleen edelliseen viitaten, mikä action tuon pyynnön ottaa vastaan?
Tuon destroy_marked:in ei siis pitäisi olla mikään id, joten edelleen
reiteissä näyttäisi olevan jotain häikkää.

//jarkko

marika

unread,
Apr 16, 2009, 6:13:51 AM4/16/09
to Ruby on Rails: Finnish
Juu, ei pitäisi :( :(
Ohessa log:
Processing UsersController#index (for ::ffff:127.0.0.1 at 2009-04-16
13:10:35) [GET]
[4;35;1mUser Load (1.2ms) [0m [0mSELECT * FROM "users" [0m
Rendering template within layouts/users
Rendering users/index
[4;36;1mCACHE (0.0ms) [0m [0;1mSELECT * FROM "users" [0m
Completed in 46ms (View: 22, DB: 1) | 200 OK [http://localhost/users]

Processing UsersController#update (for ::ffff:127.0.0.1 at 2009-04-16
13:10:38) [PUT]
Parameters: {"commit"=>"Delete marked",
"authenticity_token"=>"Ir9CWYijcM2LnHs1TShkUY6p4m4Czzl7+Cgyl+PEtVA=",
"user_ids"=>["8", "9"], "id"=>"destroy_marked"}
[4;35;1mUser Load (0.2ms) [0m [0mSELECT * FROM "users" WHERE
("users"."id" = 0) [0m

ActiveRecord::RecordNotFound (Couldn't find User with
ID=destroy_marked):
app/controllers/users_controller.rb:97:in `find_user'
/usr/local/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/local/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/local/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/local/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/local/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/local/lib/ruby/1.8/webrick/server.rb:82:in `start'

Rendered rescues/_trace (102.7ms)
Rendered rescues/_request_and_response (0.5ms)
Rendering rescues/layout (not_found)

marika

unread,
Apr 16, 2009, 6:29:02 AM4/16/09
to Ruby on Rails: Finnish
Ilmeisesti siis update ottaa pyynnön vastaan. Miten saan muutettua sen
oikein? Eli pyynnön pitäisi mennä destroy_marked -actionille.

marika

unread,
Apr 16, 2009, 6:32:20 AM4/16/09
to Ruby on Rails: Finnish
Ja vaikka kokeilisin laittaa update-actioniin '@user.destroy_all(:id
=> params[:user_ids])', niin edelleen tulee sama virheilmoitus
'Couldn't find User with ID=destroy_marked'

marika

unread,
Apr 16, 2009, 6:47:56 AM4/16/09
to Ruby on Rails: Finnish
rake routes antaa seuraavan:

users GET /users(.:format)
{:controller=>"users", :action=>"index"}
POST /users(.:format)
{:controller=>"users", :action=>"create"}
new_user GET /users/new(.:format)
{:controller=>"users", :action=>"new"}
edit_user GET /users/:id/edit(.:format)
{:controller=>"users", :action=>"edit"}
user GET /users/:id(.:format)
{:controller=>"users", :action=>"show"}
PUT /users/:id(.:format)
{:controller=>"users", :action=>"update"}
DELETE /users/:id(.:format)
{:controller=>"users", :action=>"destroy"}
root /
{:action=>"index", :controller=>"home"}
destroy_marked_users PUT /users/destroy_marked(.:format)
{:controller=>"users", :action=>"destroy_marked"}
GET /users(.:format)
{:controller=>"users", :action=>"index"}
POST /users(.:format)
{:controller=>"users", :action=>"create"}
GET /users/new(.:format)
{:controller=>"users", :action=>"new"}
GET /users/:id/edit(.:format)
{:controller=>"users", :action=>"edit"}
GET /users/:id(.:format)
{:controller=>"users", :action=>"show"}
PUT /users/:id(.:format)
{:controller=>"users", :action=>"update"}
DELETE /users/:id(.:format)
{:controller=>"users", :action=>"destroy"}
user_links GET /users/:user_id/links(.:format)
{:controller=>"links", :action=>"index"}
POST /users/:user_id/links(.:format)
{:controller=>"links", :action=>"create"}
new_user_link GET /users/:user_id/links/new(.:format)
{:controller=>"links", :action=>"new"}
edit_user_link GET /users/:user_id/links/:id/edit(.:format)
{:controller=>"links", :action=>"edit"}
user_link GET /users/:user_id/links/:id(.:format)
{:controller=>"links", :action=>"show"}
PUT /users/:user_id/links/:id(.:format)
{:controller=>"links", :action=>"update"}
DELETE /users/:user_id/links/:id(.:format)
{:controller=>"links", :action=>"destroy"}


On 16 huhti, 13:32, marika <marika.aho...@gmail.com> wrote:
> Ja vaikka kokeilisin laittaa update-actioniin '...@user.destroy_all(:id

Jarkko Laine

unread,
Apr 16, 2009, 10:03:02 AM4/16/09
to finnis...@googlegroups.com
Ongelma lienee se, että rivi

PUT /users/:id(.:format)

on ennen omaa reittiäsi, ja nämä kaksi törmäävät, eli Rails ei tiedä
että PUT-pyyntö osoitteeseen /users/destroy_marked ei tarkoittaisi yo.
reittiä id:llä destroy_marked. Muutenkin kannattaa käyttää
POST-metodia jos toiminto ei ole RESTin mukainen.

Toinen juttu on, että kannattaa miettiä voisiko tuon toiminnon
toteuttaa REST-tyyppisesti, jolloin koko erikoistoiminnon ja -reitin
luomiselta voisi välttyä kokonaan.

marika

unread,
Apr 16, 2009, 10:12:19 AM4/16/09
to Ruby on Rails: Finnish
Nyt meni kyllä niin yli hilseen, että täytyy vaan tyytyä klikkaileen
käyttäjät yksitellen ;)

Kiitti kuitenkin :)

marika

unread,
Apr 16, 2009, 10:22:29 AM4/16/09
to Ruby on Rails: Finnish
Itse asiassa en vielä heittänytkään rukkasia naulaan :)

Pääsin eteenpäin vaihtamalla post-metodit.

seuraava ongelma lienee:
def destroy_marked
@users.destroy_all(:id => params[:user_ids])
end
koska ohjaus tapahtuu nyt oikeaan actioniin (destroy_marked). Mutta
tulee virheilmoitus:
'You have a nil object when you didn't expect it! The error occurred
while evaluating nil.destroy_all'

Pääseekö tästä miten eteenpäin?

On 16 huhti, 17:03, Jarkko Laine <jar...@jlaine.net> wrote:

marika

unread,
Apr 16, 2009, 11:09:46 AM4/16/09
to Ruby on Rails: Finnish
Itse asiassa en vielä heittänytkään rukkasia naulaan :)

Pääsin eteenpäin vaihtamalla post-metodit.

seuraava ongelma lienee:
def destroy_marked
@users.destroy_all(:id => params[:user_ids])
end
koska ohjaus tapahtuu nyt oikeaan actioniin (destroy_marked). Mutta
tulee virheilmoitus:
'You have a nil object when you didn't expect it! The error occurred
while evaluating nil.destroy_all'

Pääseekö tästä miten eteenpäin?

On 16 huhti, 17:03, Jarkko Laine <jar...@jlaine.net> wrote:

marika

unread,
Apr 16, 2009, 11:18:51 AM4/16/09
to Ruby on Rails: Finnish
JES! JES! JES!!

Vihdoinkin toimii. Kiitos avustasi, Jarkko!

Muutin @users.destroy_all(:id => params[:user_ids])
=> User.destroy_all(:id => params[:user_ids])

Nyt sitten restejä opettelemaan :)
Reply all
Reply to author
Forward
0 new messages